你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32函数地址赋值给变量后结果会自动加1

[复制链接]
灰泥鳅 提问时间:2021-6-29 18:46 / 已解决

最近在做LiteOS系统的移植,需要将任务地址(函数地址)赋值给任务堆栈,但是在过程中发现,被赋值的变量会比实际的函数地址多1。比如有函数地址为0x080033D8,将其赋值给变量a后,则变量a的结果会变成0x080033D9,并且将a和该函数地址做比较结果也是相等的,具体现象如下图:
函数地址赋值给变量后结果会自动加1.png 目前使用的芯片是STM32F103R8Tx,据我了解,STM32系列芯片仅支持thumb state,即xPSR的T标志必须保持为1,否则会进入故障。而常用的BX指令会导致T标志清零,但如果BX REG指令中目标地址的LSB(最低有效位)为1则不会清零T标志位。看现象,好像CPU具有根据当前的thumb state模式自动将地址的最低有效位设置为1的功能。在freeRTOS系统中,有下面的操作:
*pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK;        /* PC */
即它特地使用了portSTART_ADDRESS_MASK在任务地址赋值的时候根据用户设置,决定最低位是否清零。

因此个人推断:
ARM会根据T标志,在对PC寄存器的数据操作时,会相应地操作LSB,如果T标志为1则将PC的值复制到目标寄存器后同时将保障结果的LSB为1.

不知道这种推断是否正确,哪位朋友知道相关的权威资料?
收藏 评论1 发布时间:2021-6-29 18:46

举报

1个回答
xmshao 最优答案 回答时间:2021-6-30 09:53:41
对于cortex M核的芯片,任何跳转相关地址的最低位,即BIT0都应是1。该位表示将用到的的指令集为Thumb指令。这点在ARM公司提供的各内核的Generic User Guide
有提及:Bit[0] of any address you write to thePC with a BX, BLX, LDM,LDR, or POPinstruction must be 1for correctexecution, because this bit indicates the required instruction set, and theCortex-M4
processoronly supports Thumb instructions
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版