1、ucos一個信號量被不斷的post而沒有被pend信號量會不斷累計嗎
計數初值表示所具有的資源數,應該不能取0吧,比如你去銀行辦理業務,業務員數就是資源數,也就是計數初值。如果為1則表示只有1個業務員,不知道你理解沒?
2、ucosii請求信號量後沒有切換任務為什麼
任務2輸出5之後,由於等待信號量被掛起,之後任務1輸出3,然後發信號量,注意發信號亮並專不是簡單的屬+1,OSSemPost中有這幾行代碼
if (pevent->OSEventGrp != 0) {
(void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
OS_EXIT_CRITICAL();
OS_Sched();
return (OS_ERR_NONE);
}
此時因為任務2的優先順序較1低,所以沒有立即運行,而是任務1繼續輸出4、0然後掛起自己,任務2就運行了,輸出678
3、周立功lpc2131嵌入式ucos關於信號量的實驗,
OSSemPend和OSSemPost生產與消費的關系,想消費得先生產;一個是產生信號量,一個是消耗信號量。
第二個版任權務掛起等待,直到第一個任務產生信號量,這時第二個任務就消耗掉這個信號量,繼續運行。調用OSSemPend在檢測到資源數目等於0進行等待的時候會進行任務切換OS_Sched()
4、為什麼UC/OS-II創建互斥信號量失敗
為什麼UC/OS-II創建互斥信號量失敗?該怎麼處理
/*申請兩個信號量,用於同步*/
SempEmpty=OSSemCreate(BUFFER_SIZE);
if(SempEmpty==NULL)
{
printf( "Create semophore fail.\n ");
//return;
}
SempFull=OSSemCreate(0);
if(SempFull==NULL)
{
printf( "Create semophore fail.\n ");
//return;
}
/*申請一個互斥信號量,用於任務間互斥*/
SempMutex=OSMutexCreate(2,&err);
if(SempMutex==NULL)
{
printf( "Create mutex fail.\n ");//為什麼創建不成功啊??
//return;
}
前兩個信號量創建都成功,但創建的互斥信號糧總是返回NULL,奇怪啊,把SempMutex=OSMutexCreate(2,&err);
這句移到SempEmpty=OSSemCreate(BUFFER_SIZE);這句的前面最後創建的哪個信號量又失敗!,也就是創建三個信號量,最後哪個總是失敗(返回NULL)!!
------解決方案--------------------
LZ可以看看ucos2總共可以申請的muxsem是多少 我記得是可以配置的
5、uCOS II的信號量及任務優先順序問題求助
任務2輸出5之後,由於等待信號量被掛起,之後任務1輸出3,然後發信號量,注意發信號亮並不是簡單的+1,OSSemPost中有這幾行代碼
if (pevent->OSEventGrp != 0) {
(void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
OS_EXIT_CRITICAL();
OS_Sched();
return (OS_ERR_NONE);
}
此時因為任務2的優先順序較1低,所以沒有立即運行,而是任務1繼續輸出4、0然後掛起自己,任務2就運行了,輸出678
6、ucosiii怎麼創建一個二值型信號量
OSSemPost 和OSSemPend是成對出現的復,在程序制OSSemPost 尚未運行到的時候,在等待Sem的 OSSemPend是會把當前的任務掛起,直到另外一個任務的OSSemPost 運行完畢都得到Sem。但是可以通過改變OSSemCreate(x)裡面的值x改變這種局面,當x不為0時
7、ucos的各種信號量都在什麼時候調用
#include "INCLUDES.h"
#define TASK_STK_SIZE 512
char *s1="MyTask";
char *s2="YouTask";
INT8U err; //定義一個錯誤信息
INT8U y=0;
OS_EVENT *Fun_Semp; //聲明信號量 是事件控制塊ECB類型的
//注意,前面有一個例子2 定義了互斥信號量,定義如下
//BOOLEAN ac_key; //信號量,互斥信號量 實質上就是一個標志位,是一個全局變數,來標志共享資源的訪問情況
//這樣,當已經有任務訪問共享資源時,其他的任務就不能訪問,知道該資源未被訪問,其他的任務才可以進行訪問
//注意這兩個信號量的區別和使用情況
OS_STK StartTaskStk[TASK_STK_SIZE]; //定義任務堆棧區
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
void Fun(INT8U x,INT8U y);
void StartTask(void *data);
void MyTask(void *data);
void YouTask(void *data);
void main (void)
{
Fun_Semp=OSSemCreate(1); //在主函數中創建信號量 返回值為創建的信號量指針,參數是信號量的計數器的值
//用該參數對信號量計數器OSEventCnt進行初始化
//1即代表只創建一個信號量,代表信號量用於對共享資源的訪問(例如,把它當做二值信號量使用),詳見P166
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);
OSTaskCreate(StartTask,(void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0); //創建起始函數
OSStart();
}
void StartTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT16S key;
pdata = pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask,(void *)0, &MyTaskStk[TASK_STK_SIZE - 1], 1); //創建任務函數
OSTaskCreate(YouTask,(void *)0, &YouTaskStk[TASK_STK_SIZE - 1], 2); //創建任務函數
for (;;)
{
//如果恩下ESC鍵,則退出UC/OS-II
if (PC_GetKey(&key) == TRUE)
{
if (key == 0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,3,0);
}
}
//MyTask的函數代碼
void MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
for (;;)
{
OSSemPend(Fun_Semp,0,&err); //請求信號量 參數Fun_Semp是信號量指針 0那一項是等待時限timeout,0表示無限等待
//err表示錯誤信息
PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE); //顯示MyTask字元串
Fun(7,y); //調用Fun函數
OSSemPost(Fun_Semp); //發送信號量 釋放信號量,函數的參數Fun_Semp代表信號量的指針
OSTimeDlyHMSM(0,0,1,0);
}
}
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 //Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for (;;)
{
OSSemPend(Fun_Semp,0,&err); //請求信號量
PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
Fun(7,y); //調用FUN函數
OSSemPost(Fun_Semp); //釋放信號量
OSTimeDlyHMSM(0,0,2,0); //等待2s
}
}
//公共的函數Fun的代碼
void Fun(INT8U x,INT8U y)
{
PC_DispStr(x,y," Calling FUN()",DISP_BGND_BLACK+DISP_FGND_WHITE); //顯示字元串,表示調用了Fun函數
}
//創建信號量時,用的參數為1,即Fun_Semp=OSSemCreate(1); ,只創建了一個信號量,這種情況一般是信號量用於對
//共享資源的訪問(例如,可以把它當做二值信號量使用)
//在上面的程序中,當MyTask運行時,先請求獲得了信號量,對共享資源Fun函數進行訪問,由於只創建了一個信號量,
//所以在MyTask的訪問期間,即使任務YouTask也進行申請信號量,此時OSEventCnt是值已經為0了,所以會把任務
//YouTask列入任務等代表OSEventTbl[]中,使任務處於等待狀態。
//只有等MyTask對Fun函數訪問完成了,調用OSSemPost(Fun_Semp);釋放了信號量,該釋放信號量的函數會先檢查任務等待
//表中是否還有等待信號量的任務,如果有,則使任務進入就緒態後,調用調度器OS_Sched()引發一次任務調度,去運行等待
//任務列表中優先順序最高的任務。如果沒有,則就把信號量計數器OSSemCnt加1.
//所以任務YouTask要想訪問Fun()函數,必須等到任務MyTask對Fun訪問完畢,釋放了信號量之後,才能訪問,反之亦然
//所以由上面可以看出,只創建一個信號量,即OSSemCreate(1);,作用就相當於使用一個二值信號量,標志共享資源是否正在
//被訪問
//看懂了上面的分析,也就可以解釋實驗現象了,由於YouTask等待2s,MyTask等待1s,所以有可能在MyTask訪問Fan函數期間,YouTask
//也來訪問(也有可能是反過來),但是由於信號量已經被MyTask佔用了,所YouTask只好等待,MyTask使用完了,釋放了信號量,YouTask才能正常使用Fun函數
//這樣也就解決了多任務對共享資源的使用的問題,使任務之間得到了同步
//要仔細分析信號量工作的原理,把上面的內容看懂了,基本上也就可以使用信號量了
8、在Ucos操作系統下創建信號量的的一個參數(OS_SEM_CTR )1,這個參數設置為1是控制什麼的?
?