硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1340|回复: 2
收起左侧

[ThreadX全家桶] GD32移植ThreadX移植中的疑惑?请大家帮我看看。

[复制链接]

4

主题

25

回帖

37

积分

新手上路

积分
37
发表于 2022-9-24 22:45:24 | 显示全部楼层 |阅读模式
  • startup_gd32f10x_hd.s是这样写的。
[Asm] 纯文本查看 复制代码
                    AREA    |.text|, CODE, READONLY
;/* reset Handler */
Reset_Handler       PROC
                    EXPORT  Reset_Handler                     [WEAK]
                    IMPORT  __main
                    IMPORT  SystemInit  
                    LDR     R0, =SystemInit
                    BLX     R0
                    LDR     R0, =__main
                    BX      R0
                    ENDP
  • tx_thread_context_restore.s 和 tx_thread_context_save.s 是这样写的
[Asm] 纯文本查看 复制代码
    AREA    ||.text||, CODE, READONLY
    PRESERVE8


  • 我不明白什么时候要加PRESERVE8,什么要加入PRESERVE8呢? 网上説:“PREQUIRE8指令指定当前文件要求堆栈八字节对齐”,但是我还是不明白! 大家给我讲讲呗~~

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2022-9-24 23:16:11 | 显示全部楼层
这个是AAPCS的要求,GD也有
image.png
回复

使用道具 举报

4

主题

25

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2022-9-25 10:43:00 | 显示全部楼层
谢谢!

ARM网站解释PRESERVE8如下:
Snipaste_2022-09-25_10-41-47.png

我自己从网上找查的资料总结:
1. 汇编文件中需要我们亲自动手来保证遵守AAPCS栈使用约定。
2. 在C文件中,由编译器来处理。
3. 由于程序的入口点为复位中断响应函数,一般我们都写在启动代码里,通常是一个汇编文件,然后经由汇编进入到C程序的main入口处,在调用main的时刻,为遵循AAPCS,就得在此时保持8字节对齐。
4. 对于MSP,Keil MDK为我们提供了一个用来初始化C运行库环境的函数_main,这个函数会调用_user_setup_stackheap函数,该函数将MSP的低三位清零,然后在进入main之前不对其进行更改,这样在进入main的时刻,MSP保证为8字节对齐的。
5. 对于PSP,一般在上多任务OS时会用它,对于PSP我们要比MSP更为操心点,因为MSP起码还可以通过调用_main来跳进main的方式保证进入C世界的时候是遵守约定的。而PSP全靠自己来保证每次进入C世界时是8字节对齐。
6. 另外只要是汇编文件,可配合使用汇编命令armasm --diag_warning 1546,这样汇编器就会对一些SP没有8字节对齐的地方给出警告,但是我发现汇编器并不能保证检测到所有对SP造成8字节不对齐的操作,例如直接给SP载入一个立即数这种,汇编器就发现不了。我并没有对所有会影响SP的指令进行测试(原因是不熟悉。。。),不知道1546这个警告能覆盖多少指令,所以总的来讲,对汇编文件就是睁大自己的钛合金眼,争取大部分工作都放到C中去。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-15 00:16 , Processed in 0.042013 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表