小弟现在用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 *)Ini
tial_spTop, /* The initial stack pointer */
Reset_Handler, /* Reset Handler */
NMI_Handler, /* NMI Handler */
HardFault_Handler, /* Hard Fault Handler */
}
调试stm32时运行一条语句后进入硬中断HardFault_Handler
typedef struct _PARA_SET
{
#if STRING_STORE_USE_ARRAY
char name[NAME_STRING_MAX];
char alias[ALIAS_STRING_MAX];
char unit[UNIT_STRING_MAX];
char strValue[LINE_STRING_MAX];
#else
char *name;
char *alias;
char *unit;
char *strValue;
#endif
tParaType type;
FLOAT32 value;
FLOAT32 MaxValue;
FLOAT32 MinValue;
FLOAT32 DefValue;
}tParaSet;
tParaSet DevCommSets[3];
static void DEV_ReadCommSets(void)
{
UINT32 i, value;
tParaSet *pSets = DevCommSets;
DF_ReadMainMemoryPage(SAVE_DEV_COMM_SETS_PAGE,
DEV_ReadData, COMM_MAX_SETS * 4 + 4);
for (i = 0; i < COMM_MAX_SETS; i++)
{
value = BytesToDword(&DEV_ReadData[i * 4]);
pSets->value = value;
if ((pSets->value > pSets->MaxValue) || (pSets->value < pSets->MinValue))
{
pSets->value = pSets->DefValue;
}
pSets++;
}
DEV_CommSetsCrc = BytesToDword(&DEV_ReadData[i * 4]);
}
调试过程如下:
(gdb) n
Reset_Handler () at startup_stm32f10x_hd.c:262
262 SystemInit();
(gdb) n
268 __Init_Data();
(gdb) n
271 main();
(gdb) n
Breakpoint 1, DEV_ReadCommSets () at device.c:980
980 for (i = 0; i < COMM_MAX_SETS; i++)
(gdb) n
982 value = BytesToDword(&DEV_ReadData[i * 4]);
(gdb) n
984 pSets->value = value; //运行这条语句后进入硬中断void HardFault_Handler(void){ while(1){} }中,不知道为什么?
(gdb) n
HardFault_Handler () at stm32f10x_it.c:61
61 {
(gdb) n
64 {}
一周热门 更多>