1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
今天想把ucosii移植到手头的一块AVR128芯片上。
只要有移植经验,其它的问题都比较好解决。但是ICC编译器对于函数指针的处理方式特别怪异,让我大吃苦头,纠结调试了半天!!! 症状:编译通过后,运行时卡死。经在AVR Studio中JTAG硬仿真,发现任务调度不了。最终目光聚焦在移植代码里函数中的一行: tmp = *(INT16U const *)task; /* (1) ICC compiler handles function pointers indirectly! */ 这是取得函数指针指向的函数地址。 一般编译器下直接写成 tmp = task 就可以了,但是“ICC compiler handles function pointers indirectly! ”, ICCAVR编译器对函数指针的处理是间接的(indirectly),函数指针是保存在一个函数入口列表(function table entry)中,该列表位于Flash空间,而不能直接获得。 tmp = *(INT16U const *)task 这样是ICCAVR下特有的获得函数地址的方法,而且使用了const关键字。这里是重点了,这里使用的const关键字要求const指定的代码是放在flash中的,否则也一样无法获得正确的函数地址。这要求在编译器下做以下设置: 选择Project-》options,在Compiler选项卡中,Treat ‘const’ as ‘__flash’ (ba.。。 这一项要求被选中。 这样设置后,函数指针就会经过查找一个存储在flash中的函数表而间接获得,编译出来的结果才能正确执行。 |
|
|
|
只有小组成员才能发言,加入小组>>
2548 浏览 0 评论
1145浏览 2评论
744浏览 1评论
498浏览 0评论
263浏览 0评论
424浏览 0评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 17:39 , Processed in 1.617623 second(s), Total 78, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号