完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在做LiteOS系统的移植,需要将任务地址(函数地址)赋值给任务堆栈,但是在过程中发现,被赋值的变量会比实际的函数地址多1。比如有函数地址为0x080033D8,将其赋值给变量a后,则变量a的结果会变成0x080033D9,并且将a和该函数地址做比较结果也是相等的。
目前使用的芯片是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个回答
|
|
在STM32系列芯片中,Thumb状态下的指令地址必须是偶数,即最低有效位为0。当你将函数地址赋值给变量后,如果函数地址的最低有效位为1,那么赋值给变量后的结果会自动加1,以确保地址是偶数。
这是因为在Thumb状态下,指令集的最低有效位标志着是32位指令还是16位指令。当最低有效位为0时,表示是16位指令;当最低有效位为1时,表示是32位指令。为了保证程序能正常运行,当函数地址为奇数时,STM32系列芯片会自动对地址进行调整,将最低有效位修改为0,保证地址为偶数。 因此,当你将函数地址赋值给变量后,变量的值会自动加1,以确保地址的最低有效位为0,并且确保了函数的正确访问。这不会影响函数的执行,因为最终执行的地址会根据指令集的规则进行调整。 需要注意的是,在进行地址比较时,由于STM32芯片会自动调整地址的最低有效位,所以即使变量的值加了1后,与函数地址做比较结果仍然是相等的。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1590 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1529 浏览 1 评论
962 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
676 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1572 浏览 2 评论
1856浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
630浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
512浏览 3评论
520浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
495浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-17 09:15 , Processed in 0.722586 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号