ucosii在AVR系列单片机移植中出现的一个BT的问题

来源:本站
导读:目前正在解读《ucosii在AVR系列单片机移植中出现的一个BT的问题》的相关信息,《ucosii在AVR系列单片机移植中出现的一个BT的问题》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《ucosii在AVR系列单片机移植中出现的一个BT的问题》的详细说明。
简介:今天想把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中的函数表而间接获得,编译出来的结果才能正确执行。

提醒:《ucosii在AVR系列单片机移植中出现的一个BT的问题》最后刷新时间 2024-03-14 01:08:20,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《ucosii在AVR系列单片机移植中出现的一个BT的问题》该内容的真实性请自行鉴别。