uc/os-ii實驗1:訊號量
阿新 • • 發佈:2019-01-28
開發板:正電原子STM32F103 MINI
實現功能:通過按鍵控制LED燈亮滅
要點:訊號量的請求與傳送
程式碼如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "includes.h"
//功能:按鍵控制LED燈亮滅
//設定任務堆疊大小
#define LED_STK_SIZE 64
#define KEY_STK_SIZE 64
#define START_STK_SIZE 64
//設定任務堆疊
OS_STK LEDTaskStk[LED_STK_SIZE];
OS_STK KEYTaskStk[KEY_STK_SIZE];
OS_STK StartTaskStk[KEY_STK_SIZE];
//設定任務優先順序
#define LED_TASK_PRIO 5
#define KEY_TASK_PRIO 7
#define START_TASK_PRIO 9
//設定事件
OS_EVENT *Sem_P;
INT8U err=0;
//任務宣告
void TaskLED(void *p);
void TaskKEY(void *p);
void TaskStart(void *p);
//系統時鐘配置函式
void SysTick_Configuration(void);
int main(void)
{
Stm32_Clock_Init(9); //系統時鐘設定
LED_Init(); //初始化與LED連線的硬體介面
KEY_Init();
SysTick_Configuration();
OSInit();
OSTaskCreate(TaskStart,(void *)0,(OS_STK*)&StartTaskStk[START_STK_SIZE-1],START_TASK_PRIO);
OSStart();
return 0;
}
//啟動任務
//控制DS0的亮滅.
void TaskStart(void *pdata)
{
pdata=pdata;
OS_ENTER_CRITICAL();
//建立事件
Sem_P=OSSemCreate(0);
OSTaskCreate(TaskLED,(void*)0,(OS_STK*)&LEDTaskStk[LED_STK_SIZE-1],LED_TASK_PRIO);
OSTaskCreate(TaskKEY,(void*)0,(OS_STK*)&KEYTaskStk[KEY_STK_SIZE-1],KEY_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO);
OS_EXIT_CRITICAL();
}
//任務1 LED
void TaskLED(void *pdata)
{
pdata=pdata;
LED0=0;
while(1)
{
OSSemPend(Sem_P,0,&err);
LED0=!LED0;
OSTimeDlyHMSM(0,0,0,100);
}
}
//任務2 KEY
void TaskKEY(void *pdata)
{
pdata=pdata;
while(1)
{
if(KEY1==1) //按鍵按下
{
while(KEY1==1)
{
OSTimeDlyHMSM(0,0,0,100); //等待100ms
}
OSSemPost(Sem_P); //按鍵按下,傳送訊號量 按鍵按下鬆開只發送一次訊號量
OSTimeDlyHMSM(0,0,0,100); //等待100ms
}
else //按鍵沒有按下
{
OSTimeDlyHMSM(0,0,0,100);
}
}
}
//系統時鐘中斷服務函式
void SysTick_Handler(void)
{
OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */
OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */
}
//系統時鐘配置,設計1ms產生一次中斷
void SysTick_Configuration(void)
{
SysTick->CTRL&=~(1<<2);//SYSTICK使用外部時鐘源
SysTick->CTRL|=1<<1; //開啟SYSTICK中斷
SysTick->LOAD=9000; //產生1ms中斷
//bit2清空,選擇外部時鐘 HCLK/8
SysTick->CTRL|=1<<0; //開啟SYSTICK
}