臺資黑工廠里寫的, 字體為繁體, 我也懶的轉換了, 反正看的人也不多..
個人理解信號量的作用: 任務之間同步的標識, 或是對共享資源操作的一個鎖匙(MS 有更強大的互斥型的信號量). 總之不管那么多, 一個任務可以等待一個信號量. 任務或是中斷可以發送信號量, 等待信號量的任務在收到信號量的時候就繼續運行. 可以多個任務同時等待一個信號量, 但只有優先級最高的任務得到信號量并執行. 中斷不可使用信號量.
簡單的信號量應用
一: 先在 OS_CFG.H 中把 OS_SEM 打頭的幾個全部定義為 1;OS_MAX_EVENTS 為所有的事件數量(包括消息隊列等), 定義為多少看情況, 我設定為 20(每加一個就多用掉了近 100 字節的 RAM).
二: 定義一個 OS_EVENT 弄的指針 方法: OS_EVENT *SBSB;
三: 在任務中創建一個信號量 方法: SBSB=OSSemCreate(5); 這樣 SBSB 就是一個指向了新建的一個信號量. 后面那個 5 表示初始值, 表示現在有 5 個信號量
四: 接下來就可以在任務中使用信號量了(中斷中只可以發送信號量)
等待信號量方法:OSSemPend(SBSB,0,&ERROR); // 等待 SBSB 這個信號量 后面的一個參數為超時,0 表示永不超時, 時間單位為 OS 的 TIMESTICK, 第三個參數為錯誤代碼
發送信號量方法: 很簡單 OSSemPost(SBSB); 就收工了
下面是我寫的最簡單應用,STM32 用的, 放到這里, 以免以后忘了.
#include“stm32f10x_lib.h”#include“includes.h”OS_STK os_sysinit_stk[60];
OS_STK os_ledshow_stk[60];
OS_STK os_ideluser_stk[60];
void os_sysinit_task(void *pdata)
{
INT8U ERROR;
sysinit();
initGPIOA();
while (1)
{OSSemPend(SEM01, 0, &ERROR);
OSTimeDly(40);
GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);
OSTimeDly(20);
GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
}
}
void os_ledshow_task(void *pdata)
{while (1)
{OSTimeDlyHMSM(0, 0, 0, 20);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
// USART_SendData(USART1,044);
OSTimeDlyHMSM(0, 0, 1, 0);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
}
}
void os_ideluser_task(void *pdata)
{while (1)
{OSTimeDlyHMSM(0, 0, 4, 0);
OSSemPost(SEM01);
OSSemPost(SEM01);
OSSemPost(SEM01);
}
}
void os_creat_all(void)
{OSTaskCreate(os_sysinit_task, (void *)0, &os_sysinit_stk[59], 2); // 建立一個任務
OSTaskCreate(os_ledshow_task, (void *)0, &os_ledshow_stk[59], 3); // 再建立一個任務
OSTaskCreate(os_ideluser_task, (void *)0, &os_ideluser_stk[59], 4);
}
正文完