历史上的今天
今天是:2025年01月15日(星期三)
2020年01月15日 | STM32栈和堆使用不同RAM的实现方法
2020-01-15 来源:eefocus
最近在调试将开源数据压缩算法zlib移植到STM32的工程中. 由于zlib要占用大量的动态内存(缺省设置下需要至少280kB左右的内存), STM32内部的48kB 的SRAM远远不够用, 因此必须将动态内存分配使用的内存堆(HEAP)设置在外部的扩展RAM中去.
我在使用的STM32中用了一个别人写的已经烧好的IAP Bootloader, Bootloader中会检查用户程序的向量表首地址(即__initial_sp), 如果发现这个地址的值不在内部ram中, 就认定没有合法的用户程序, 而进入死循环状态拒绝跳转. 另外, 从抗干扰性和稳定性角度出发, 我也的确希望栈放在内部ram中. 这就要求: 将stack分配到内部ram, 而将heap分配到外部ram中
这个问题直接上网找是找不到的, 我实验了很多方法, 找到了一种最简单的解决方案:
将stm32f10x_vector.s中关于heap的设置都提出来, 形成一个新的.s文件, 命名为custom_heap.s, 内容如下:
Heap_Size EQU 0x000A000 ;
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
EXPORT __heap_base
EXPORT __heap_limit
END
将这个新的custom_heap.s加到工程中, 同时将stm32f10x_vector.s中提出去的关于heap的设置部分都注释掉.
右键点击custom_heap.s, 选择option, “Zero Initialized Data” 选择外部Ram, 如下:

重新build即可. 新的map文件中可以看出现在stack和heap使用的是不同的ram了.
上一篇:stm32 栈溢出 错误
史海拾趣
|
我们最近要做一个计算机系统结构的实验箱,我不知从何入手。 实验箱主要是这样的, 核心FPGA板 留给用户设计各种cpu , 比如 流水cpu 超标量cpu 等,也就是用来给学生自己开发cpu。 我要做的就是做一个控制部分的电路设计。可以 控制 ...… 查看全部问答> |
|
我在工程的Header Files里添加了miracl.h和mirdef.h两个头文件,还添加了ms32.lib文件,但在编程中使用otnum()等等miracl库中的函数时仍提示错误。 Repw.obj : error LNK2019: unresolved external symbol \"int __cdecl otnum(struct bigtype *,v ...… 查看全部问答> |
|
小弟由于想转入到嵌入式开发的领域中来,所以需要一些最基本的了解,以便有一个更清晰的学习开端,请多多指教: 问题1:在网上查了下嵌入式开发的理解,但越看越晕,一会儿是嵌入式开发,一会儿是linux嵌入 ...… 查看全部问答> |
|
蓝牙新手,想请教下 void DunInit(Task theAppTask, dun_device_type type_of_device, uint16 RI, uint16 DTR, uint16 DCD, uint16 DSR, uint16 priority); 这个DUN初始化函数的参数该如何设定 附上dun.h中的函数说明: /*! &n ...… 查看全部问答> |
|
(1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT。(2)当进入中断程序时,只要不在中断中再次开中断,刚总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行。(3)若在中断A中开了总中断,刚可以响应 ...… 查看全部问答> |
|
module moto_test(clock,key,duty_cycle,pwm_en,pwm_in,motoa,motob,led); input clock; //系统时钟(48MHz) input[2:0] ...… 查看全部问答> |




