启动运行后,系统函数rt_object_get_information一直返回RT_NULL,一直崩溃,RT-Thread 里边rt_object_container是个全局变量:
struct rt_object_information *
rt_object_get_information(enum rt_object_class_type type)
{
int index;
for (index = 0; index < RT_Object_Info_Unknown; index ++)
if (rt_object_container[index].type == type) return &rt_object_container[index];
return RT_NULL;
}
static struct rt_object_information rt_object_container[RT_Object_Info_Unknown] =
{
/* initialize object container - thread /
{RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Thread), sizeof(struct rt_thread)},
#ifdef RT_USING_SEMAPHORE
/ initialize object container - semaphore */
{RT_Object_Class_Semaphore, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Semaphore), sizeof(struct rt_semaphore)},
#endif
GDB调试如下(type == 9肯定时存在的):
我使用 print &rt_object_container, 发现rt_object_container里的所有变量都是0xFF值。
sct链接文件与startup.s 参考如下startup(用armcc编译):
对比了其它型号,我发现GD32目录下的都startup.s都是如下格式:
;/* reset Handler */
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
与gcc版本的相比:
Reset_Handler:
ldr r1, =_sidata
ldr r2, =_sdata
ldr r3, =_edata
subs r3, r2
ble fill_bss_start
loop_copy_data:
subs r3, #4
ldr r0, [r1,r3]
str r0, [r2,r3]
bgt loop_copy_data
fill_bss_start:
ldr r1, =__bss_start
ldr r2, =__bss_end
movs r0, 0
subs r2, r1
ble startup_enter
GCC版本都多了一些数据段初始化fill_bss_start。
GD32直接跳转到main了,main是armcc自带的c 库函数,似乎什么也没干,正常数据段里的结构体,应当自动复制到内存吧?
有懂的大神没??