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)); /* 任务栈大小,单位字节数 */    

}
原文地址:https://www.cnblogs.com/kmust/p/7112988.html