Keil RTX使用 os_mut_init 報Hard Fault 錯誤解決記錄

badwell發表於2017-07-03

首先確定你的軟體是在互斥訊號初始化的位置,在以下幾個位置,將會報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)); /* 任務棧大小,單位位元組數 */    

}

 

相關文章