1. 程式人生 > >uc/os-ii實驗1:訊號量

uc/os-ii實驗1:訊號量

開發板:正電原子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 }