stm32是怎么获取堆和栈大小的+ucos iii

2019-07-14 23:51发布



小弟现在用CodeSourcery+jlink+openocd开发STM32

平台:stm32f103zet6
flash:内置512K(大容量)
sram:内置64K+外部512K
启动文件:startup_stm32f10x_hd.c
链接脚本:stm32f10x_flash_extsram.ld

1、没用ucos iii之前是可以正常运行的,
2、用了ucos iii之后不能正常运行,
ucosiii是能在KEIL UV4上成功运行的,初步怀疑是堆和栈的分配有问题(因为ucosiii中要用malloc动态分配内存),所以我想知道stm32是如何获取堆和栈的信息的,我怎么才能让它知道堆和栈的大小以及地址空间。

补充:栈的最高地址可以通过启动文件的下面部分知道,即stm32启动之后先要从flash的起始处取出栈的最高地址和复位向量,那堆是怎么知道的呢,我不知道IDE在这方面是怎么处理的,我想充分利用内置64K+外部512K的SRAM,不知道怎么做,谢谢
void (* const g_pfnVectors[])(void) =
{      
    (void *)Initial_spTop,      /* The initial stack pointer */
    Reset_Handler,              /* Reset Handler */
    NMI_Handler,                /* NMI Handler */
    HardFault_Handler,          /* Hard Fault Handler */
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
andy_wsj
1楼-- · 2019-07-16 06:00
本帖最后由 andy_wsj 于 2015-6-24 15:48 编辑

说说个人的看法
既然是运行 pSets->value = value;导致的硬件异常,问题就一定在这上面有迹可循
这一句可以看出pSets这个指针异常才会硬件异常,在执行之前,可不可以把指针的内存地址打印出来看看
如果pSets异常,那么看看定义
tParaSet DevCommSets[3];         

static void DEV_ReadCommSets(void)
{
   UINT32 i, value;
   
     tParaSet *pSets = DevCommSets;
......
咋一看,直接指向一个全局数组DevCommSets
既然是全局数组,那就要看编译器与装载的配置了
一般来说,使用C语言,变量和函数的地址有编译器自行分配,但编译前需要指定必要的内存范围
检查你的stm32f10x_flash_extsram.ld

一周热门 更多>