天天看點

uCOS裡的信号量錯誤筆記

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">u8 * Get_Rm04_Check_Cmd_Flag(void)有問題</span>
           

具體為:請求信号量失敗

OSSemPend(Get_Rm04_Check_Cmd_Flag_Sem,0,&m_err);			//請求信号量,檢視Rm04_Check_Cmd_Flag變量是否被占用
           

1,函數的傳回值為OS_ERR_EVENT_TYPE,檢視OSSemPend()傳回值英文說明-->>If you didn't pass a pointer to a semaphore.-->>沒有傳遞指針到信号量

2,檢視 Get_Rm04_Check_Cmd_Flag_Sem=OSSemCreate(1);的傳回值

Get_Rm04_Check_Cmd_Flag_Sem=OSSemCreate(1);		//信号量,變量Rm04_Check_Cmd_Flag的通路控制
	
	if(Get_Rm04_Check_Cmd_Flag_Sem== (void *)0)fprintf(DEBUG_FILE,"\r\n\r\n\r\n\r\n\r\nGet_Rm04_Check_Cmd_Flag--建立失敗r\n\r\n\r\n\r\n");
	
           

發現建立失敗。

3,細看後發現是uCOS配置檔案os_cfg.h裡對于事件個數限制為6,而我用了7個。将OS_MAX_EVENTS由6改為8.

4,還是出錯,檢視

OSSemPend(Get_Rm04_Check_Cmd_Flag_Sem,0,&m_err);<span style="white-space:pre">			//請求信号量,檢視Rm04_Check_Cmd_Flag變量是否被占用</span>
           

的傳回值,是OS_ERR_PEND_ISR     傳回值英文說明-->>If you called this function from an ISR and the result  would lead to a suspension.-->>中斷服務程式中調用該函數,會導緻程式挂起。

原因:中斷服務程式不能無限等待改信号量的擷取!

解決:寫了個中斷專用的信号量請求函數。(調用OSSemAccept())

u8 * Get_Rm04_Check_Cmd_Flag_ISR(void)
           

繼續閱讀