Keil RTX使用 os_mut_init 报Hard Fault 错误解决记录
首先确定你的软件是在互斥信号初始化的位置,在以下几个位置,将会报Hard Fault 错误:
(1).os_sys_init_user 用户线程创建之前
(2).os_tsk_create_user之后
规范写法:
/* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) { /* 初始化外设 */ bsp_Init(); /* 创建启动任务 */ os_sys_init_user (AppTaskStart, /* 任务函数 */ 4, /* 任务优先级 */ &AppTaskStartStk, /* 任务栈 */ sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */ while(1); } /* ********************************************************************************************************* * 函 数 名: AppTaskStart * 功能说明: 启动任务,也就是最高优先级任务。 * 形 参: 无 * 返 回 值: 无 * 优 先 级: 4 ********************************************************************************************************* */ __task void AppTaskStart(void) { /* 先创建任务间通信机制,防止任务先创建后,直接就可以使用 */ AppObjCreate(); AppTaskCreate(); while(1) { os_dly_wait(1000); } } /* ********************************************************************************************************* * 函 数 名: AppObjCreate * 功能说明: 创建任务通信机制 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppObjCreate (void) { // /* 创建信号量计数值是0, 用于任务同步 */ // os_sem_init (&semaphore, 0); // // /* 创建消息邮箱 */ // os_mbx_init (&mailbox, sizeof(mailbox)); link_mul_init(); } /* ********************************************************************************************************* * 函 数 名: AppTaskCreate * 功能说明: 创建应用任务 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void AppTaskCreate (void) { HandleTaskModbus = os_tsk_create_user(AppTaskModbus, /* 任务函数 */ 1, /* 任务优先级 */ &AppTaskModbusStk, /* 任务栈 */ sizeof(AppTaskModbusStk)); /* 任务栈大小,单位字节数 */ HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */ 2, /* 任务优先级 */ &AppTaskLEDStk, /* 任务栈 */ sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */ HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro, /* 任务函数 */ 3, /* 任务优先级 */ &AppTaskMsgProStk, /* 任务栈 */ sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */ HandleTaskPrintTest = os_tsk_create_user(AppTaskPrintfTest, /* 任务函数 */ 4, /* 任务优先级 */ &AppTaskPrintfTestStk, /* 任务栈 */ sizeof(AppTaskPrintfTestStk)); /* 任务栈大小,单位字节数 */ // HandleTaskTCPTimer = os_tsk_create_user(AppTaskTCPTimer, /* 任务函数 */ // 5, /* 任务优先级 */ // &AppTaskTCPStk, /* 任务栈 */ // sizeof(AppTaskTCPStk)); /* 任务栈大小,单位字节数 */ HandleTaskReadAD7327 = os_tsk_create_user(AppTaskReadAD7327, /* 任务函数 */ 5, /* 任务优先级 */ &AppTaskReadAD7327Stk, /* 任务栈 */ sizeof(AppTaskReadAD7327Stk)); /* 任务栈大小,单位字节数 */ HandleTaskDeviceLink = os_tsk_create_user(AppTaskDeviceLink, /* 任务函数 */ 6, /* 任务优先级 */ &AppTaskDeviceLinkStk, /* 任务栈 */ sizeof(AppTaskDeviceLinkStk)); /* 任务栈大小,单位字节数 */ HandleTaskCollectSensorData = os_tsk_create_user(AppTaskCollectSensorData, /* 任务函数 */ 7, /* 任务优先级 */ &AppTaskCollectSensorDataStk, /* 任务栈 */ sizeof(AppTaskCollectSensorDataStk)); /* 任务栈大小,单位字节数 */ HandleTaskScreenUpdate = os_tsk_create_user(AppTaskScreenUpdate, /* 任务函数 */ 8, /* 任务优先级 */ &AppTaskScreenUpdateStk, /* 任务栈 */ sizeof(AppTaskScreenUpdateStk)); /* 任务栈大小,单位字节数 */ HandleTaskLockLink = os_tsk_create_user(AppTaskLockLink, /* 任务函数 */ 9, /* 任务优先级 */ &AppTaskLockLinkStk, /* 任务栈 */ sizeof(AppTaskLockLinkStk)); /* 任务栈大小,单位字节数 */ }