历史上的今天
今天是:2025年01月07日(星期二)
2020年01月07日 | ucosii在AVR系列单片机移植中出现的一个BT的问题
2020-01-07 来源:eefocus
今天想把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中的函数表而间接获得,编译出来的结果才能正确执行。
史海拾趣
|
【IT168 服务器频道】本文向您介绍了工作负载分区(WPAR),这个 AIX 6 的新功能,它是一个通过纯软件实现虚拟化的技术。通过 WPAR 可以实现新一级别的 AIX 虚拟化功能,它补充现有的虚拟化功能的不足,实现了在不修改应用程序代码的情况下,在 ...… 查看全部问答> |
|
关于红外的些小想法,由来已久,正值五一放假来临之际,随便写写,有些想法是公司由来已久,有些是同事告知,有些是在同行那儿收集,现在,趁这个五一放假而有小小空时,在自己喜爱的千家上,写一下关于红外的随笔,希望能得到行家的指正; & ...… 查看全部问答> |
|
这是我的一些Xilinx的FPGA的论文,传上来给大家分享一下!大家多多支持啊! 我会分批上传,方便大家选择性的交流与下载!… 查看全部问答> |
|
各位大侠!小弟自己搭了一块LM3S9L97板子,现在调到CAN模块遇到了点不懂的问题请教一下, TX 就是在初始化过后然后设置ID和数据什么的 g_sCANMsgObject1.ulMsgID = 0x1001; //CAN报文ID ...… 查看全部问答> |
|
网上找了很多资料,关于单步调试的资料不多,能不能推荐些资料。 单步调试时,17-19行是每步执行一行,但到20行时,跳到24行,要三步才能跳出24行,为什么要三步呢?… 查看全部问答> |




