Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
N32L40XCL-STB
栈stack
N32L40XCL-STB 开发板模块评测任务大挑战: 官方提供的软件库中rt-thread的所有工程,堆栈设置都有问题
发布于 2023-04-20 18:46:47 浏览:415
订阅该版
以`Nationstech.N32L40x_Library.1.2.1\projects\n32l40x_EVAL\examples\RT_Thread\RT_Thread8_PIN_DEVICE_REGISTER\MDK-ARM`为例,其他工程都有问题。 `Nationstech.N32L40x_Library.1.2.1\projects\n32l40x_EVAL\examples\RT_Thread\RT_Thread8_PIN_DEVICE_REGISTER\inc\board.h`中给rt-thread的堆管理分配的对空间是 ``` #define N32L40X_SRAM_SIZE 32 #define N32L40X_SRAM_START (0x20000000 + N32L40X_SRAM_SIZE/2 * 1024) #define N32L40X_SRAM_END (0x20000000 + N32L40X_SRAM_SIZE * 1024) ``` 首先N32L40X_SRAM_SIZE应该按照实际芯片修改, 建议增加一个设备型号宏,自动修改。 我们这里N32L406C8应该是24KB ``` #define N32L40X_SRAM_SIZE 24 ``` 即将整个SRAM的后面一半12K分配给了rt-thread的堆 即`0x20003000~0x20006000`给了rt-thread的堆。 该工程配置中SRAM范围为 `0x20000000~0x20006000` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/7b5ea438f4558a7d2a1fbfa9ae29a4d8.png.webp) 对于MDK编译器他会认为整个`0x20000000~0x20006000`区域都是可用的,那么在 `Nationstech.N32L40x_Library.1.2.1\firmware\CMSIS\device\startup\startup_n32l40x.s`中预留的堆栈空间,和data,bss段等就有可能在0x20000000~0x20006000的任意地方,此时编译器不知道,不会编译失败。那么就会和rt-thread的堆重叠。 这在程序使用的SRAM比较小时可能不会出现问题,因为优先放在低地址,可能还到不了0x20003000后,在使用的SRAM比较大时那么肯定机会有问题了。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/a34e92f617f24b82b4d9e4f119664d11.png.webp) 顺便提一下上面的Stack_Size是在运行rt-thread线程之前使用的,该值放在了程序的最开始的4字节 ``` __Vectors DCD __initial_sp ; Top of Stack ``` 硬件在启动时加载该4字节到MSP中(默认启动是特权模式使用MSP),此时栈指针用的MSP。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/4186c818d683062facf3a8c136d163a4.png.webp) 在线程运行后,则使用的是rt-thread从堆中分配的线程栈,此时使用的是PSP(这是在上下文切换时修改的)。 具体就是 创建线程时 ``` rt_thread_init->_rt_thread_init->rt_hw_stack_init ``` 将psr设置为了 ``` stack_frame->exception_stack_frame.psr = 0x01000000L; /* PSR */ ``` 在启动第一个线程时 ``` rt_hw_context_switch_to ``` 触发pendsv中断 ``` ; trigger the PendSV exception (causes context switch) LDR r0, =NVIC_INT_CTRL LDR r1, =NVIC_PENDSVSET STR r1, [r0] ``` 在PendSV_Handler中断服务函数中完成真正的上下文切入 这里代码也可以看出用的就是线程栈 ``` MRS r1, psp ; get from thread stack pointer ``` 在退出中断时 ``` pendsv_exit ; restore interrupt MSR PRIMASK, r2 ORR lr, lr, #0x04 BX lr ENDP ``` 上述的`ORR lr, lr, #0x04`即设置了 中断返回后使用PSP ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/e0f2cabdf6370dc88fb6f922ef9972b2.png.webp) 而在中断中固定用的PSP使用的是Stack_Size这部分栈。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/310f38141e8ac4cbe188c6a6b15bdb3b.png.webp) 以上过程可以参考CORTEX-M3/M4架构手册 所以汇编代码中的Stack_Size要设置为满足中断服务函数和第一个线程启动前的使用。 而Heap_Size设置为0即可,因为没有使用编译器提供的c库的malloc。 而编译器中设置的SRAM要排除rt-thread的堆部分 比如后面8k给rt-thread的堆(分配出来给线程栈,其他系统对象使用) 前面的其他使用,正确配置应该如下 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/7eefe08202cbe098478dc801c1512e20.png.webp) ``` #define N32L40X_SRAM_SIZE 0x2000 #define N32L40X_SRAM_START (0x20000000 + 0x4000) #define N32L40X_SRAM_END (0x20000000 + 0x6000) ``` 这样避免了rt-thread的堆和其他data等使用区域重叠而编译器不知道。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
1
被采纳
0
关注TA
发私信
相关文章
1
局部变量的存储在哪段内存区域
2
内联函数不压栈,会因为中断导致栈内现场被破坏吗
3
串口输出线程输出异常
4
idle->sp被改写,导致内存溢出
5
如何在调试状态下查看线程堆栈的占用量?
6
map文件堆栈分配查看
7
请教线程堆栈的作用以及大小设置
8
如何打印出函数调用栈
9
线程初始化时栈地址为什么加4
10
rtthread中的栈设置请教?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部