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

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 收藏 评论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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版