對于ucos敢興趣朋友,可以參考這例程,我這使用信號量,然后直接控制為wifi小車
單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "pwm.h"
- #include "track.h"
- #include "includes.h"
- //UCOSIII中以下優先級用戶程序不能使用,ALIENTEK
- //將這些優先級分配給了UCOSIII的5個系統內部任務
- //優先級0:中斷服務服務管理任務 OS_IntQTask()
- //優先級1:時鐘節拍任務 OS_TickTask()
- //優先級2:定時任務 OS_TmrTask()
- //優先級OS_CFG_PRIO_MAX-2:統計任務 OS_StatTask()
- //優先級OS_CFG_PRIO_MAX-1:空閑任務 OS_IdleTask()
- #define START_TASK_PRIO 3 //任務優先級
- #define START_STK_SIZE 1024 //任務堆棧大小
- OS_TCB StartTaskTCB; //任務控制塊
- CPU_STK START_TASK_STK[START_STK_SIZE];//任務堆棧
- void start_task(void *p_arg); //任務函數
- #define forward_TASK_PRIO 4 //任務優先級
- #define forward_STK_SIZE 128 //任務堆棧大小
- OS_TCB forward_TaskTCB; //任務控制塊
- CPU_STK forward_TASK_STK[forward_STK_SIZE];//任務堆棧
- void forward_task(void *p_arg); //任務函數
- #define back_TASK_PRIO 5 //任務優先級
- #define back_STK_SIZE 128 //任務堆棧大小
- OS_TCB back_TaskTCB; //任務控制塊
- CPU_STK back_TASK_STK[back_STK_SIZE];//任務堆棧
- void back_task(void *p_arg); //任務函數
- #define stop_TASK_PRIO 6 //任務優先級
- #define stop_STK_SIZE 128 //任務堆棧大小
- OS_TCB stop_TaskTCB; //任務控制塊
- CPU_STK stop_TASK_STK[stop_STK_SIZE];//任務堆棧
- void stop_task(void *p_arg); //任務函數
- #define turnright_TASK_PRIO 7 //任務優先級
- #define turnright_STK_SIZE 128 //任務堆棧大小
- OS_TCB turnright_TaskTCB; //任務控制塊
- CPU_STK turnright_TASK_STK[turnright_STK_SIZE];//任務堆棧
- void turnright_task(void *p_arg); //任務函數
- #define turnleft_TASK_PRIO 8 //任務優先級
- #define turnleft_STK_SIZE 128 //任務堆棧大小
- OS_TCB turnleft_TaskTCB; //任務控制塊
- CPU_STK turnleft_TASK_STK[turnleft_STK_SIZE]; //任務堆棧
- void turnleft_task(void *p_arg); //任務函數
- #define quick_TASK_PRIO 9 //任務優先級
- #define quick_STK_SIZE 128 //任務堆棧大小
- OS_TCB quick_TaskTCB; //任務控制塊
- CPU_STK quick_TASK_STK[quick_STK_SIZE];//任務堆棧
- void quick_task(void *p_arg); //任務函數
- #define slow_TASK_PRIO 10 //任務優先級
- #define slow_STK_SIZE 128 //任務堆棧大小
- OS_TCB slow_TaskTCB; //任務控制塊
- CPU_STK slow_TASK_STK[slow_STK_SIZE]; //任務堆棧
- void slow_task(void *p_arg); //任務函數
- #define track_TASK_PRIO 11 //任務優先級
- #define track_STK_SIZE 128 //任務堆棧大小
- OS_TCB track_TaskTCB; //任務控制塊
- CPU_STK track_TASK_STK[track_STK_SIZE];//任務堆棧
- void track_task(void *p_arg); //任務函數
- #define usartcheck_TASK_PRIO 12 //任務優先級
- #define usartcheck_STK_SIZE 128 //任務堆棧大小
- OS_TCB usartcheck_TaskTCB; //任務控制塊
- CPU_STK usartcheck_TASK_STK[usartcheck_STK_SIZE];//任務堆棧
- void usartcheck_task(void *p_arg); //任務函數
- OS_SEM forward_SEM; //定義信號量
- OS_SEM back_SEM; //定義信號量
- OS_SEM stop_SEM; //定義信號量
- OS_SEM turnright_SEM;//定義信號量
- OS_SEM turnleft_SEM; //定義信號量
- OS_SEM quick_SEM; //定義信號量
- OS_SEM slow_SEM; //定義信號量
- OS_SEM track_SEM; //定義信號量
- //s16 ini_ccr=60;//賦值給比較捕獲寄存器CCR的初值
- //s16 com_ccr=60;//賦值給比較捕獲寄存器CCR的公共值
- //主函數
- int main(void)
- {
- OS_ERR err;
- CPU_SR_ALLOC();
-
- delay_init(); //時鐘初始化
- //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組配置
- //uart_init(115200); //串口初始化
- //LED_Init(); //LED初始化
- //LCD_Init(); //LCD初始化
- //KEY_Init(); //按鍵初始化
- TIM1_PWM_Init(100,9);
- uart_init(115200); //串口初始化
- track_init();
-
- OSInit(&err); //初始化UCOSIII
- OS_CRITICAL_ENTER(); //進入臨界區
- //創建開始任務
- OSTaskCreate((OS_TCB * )&StartTaskTCB, //任務控制塊
- (CPU_CHAR * )"start task", //任務名字
- (OS_TASK_PTR )start_task, //任務函數
- (void * )0, //傳遞給任務函數的參數
- (OS_PRIO )START_TASK_PRIO, //任務優先級
- (CPU_STK * )&START_TASK_STK[0], //任務堆棧基地址
- (CPU_STK_SIZE)START_STK_SIZE/10, //任務堆棧深度限位
- (CPU_STK_SIZE)START_STK_SIZE, //任務堆棧大小
- (OS_MSG_QTY )0, //任務內部消息隊列能夠接收的最大消息數目,為0時禁止接收消息
- (OS_TICK )0, //當使能時間片輪轉時的時間片長度,為0時為默認長度,
- (void * )0, //用戶補充的存儲區
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務選項
- (OS_ERR * )&err); //存放該函數錯誤時的返回值
- OS_CRITICAL_EXIT(); //退出臨界區
- OSStart(&err); //開啟UCOSIII
- }
- //開始任務函數
- void start_task(void *p_arg)//void *p_arg是空類型(無類型)指針,由函數內部強制轉換為某一具體類型的指針
- {
- OS_ERR err;
- CPU_SR_ALLOC();
- p_arg = p_arg;//表示暫時不用p_arg,防止編譯器告警
- //(void)p_arg;//表示暫時不用p_arg,防止編譯器告警
-
- CPU_Init();
- #if OS_CFG_STAT_TASK_EN > 0u
- OSStatTaskCPUUsageInit(&err); //統計任務
- #endif
-
- #ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了測量中斷關閉時間
- CPU_IntDisMeasMaxCurReset();
- #endif
-
- #if OS_CFG_SCHED_ROUND_ROBIN_EN //當使用時間片輪轉的時候
- //使能時間片輪轉調度功能,時間片長度為1個系統時鐘節拍,既1*5=5ms
- OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
- #endif
-
- OS_CRITICAL_ENTER(); //進入臨界區
-
- OSSemCreate ((OS_SEM* )&forward_SEM, //創建信號量forward_SEM
- (CPU_CHAR* )"forward_SEM",
- (OS_SEM_CTR)0,
- (OS_ERR* )&err);
- OSSemCreate ((OS_SEM* )&back_SEM, //創建信號量back_SEM
- (CPU_CHAR* )"back_SEM",
- (OS_SEM_CTR)0,
- (OS_ERR* )&err);
- OSSemCreate ((OS_SEM* )&stop_SEM, //創建信號量stop_SEM
- (CPU_CHAR* )"stop_SEM",
- (OS_SEM_CTR)0,
- (OS_ERR* )&err);
- OSSemCreate ((OS_SEM* )&turnright_SEM, //創建信號量turnright_SEM
- (CPU_CHAR* )"turnright_SEM",
- (OS_SEM_CTR)0,
- (OS_ERR* )&err);
- OSSemCreate ((OS_SEM* )&turnleft_SEM, //創建信號量turnleft_SEM
- (CPU_CHAR* )"turnleft_SEM",
- (OS_SEM_CTR)0,
- (OS_ERR* )&err);
- OSSemCreate ((OS_SEM* )&quick_SEM, //創建信號量quick_SEM
- (CPU_CHAR* )"quick_SEM",
- (OS_SEM_CTR)0,
- (OS_ERR* )&err);
- OSSemCreate ((OS_SEM* )&slow_SEM, //創建信號量slow_SEM
- (CPU_CHAR* )"slow_SEM",
- (OS_SEM_CTR)0,
- (OS_ERR* )&err);
- OSSemCreate ((OS_SEM* )&track_SEM, //創建信號量track_SEM
- (CPU_CHAR* )"track_SEM",
- (OS_SEM_CTR)0,
- (OS_ERR* )&err);
- //創建任務forward_task
- OSTaskCreate((OS_TCB * )&forward_TaskTCB,
- (CPU_CHAR * )"forward_task",
- (OS_TASK_PTR )forward_task,
- (void * )0,
- (OS_PRIO )forward_TASK_PRIO,
- (CPU_STK * )&forward_TASK_STK[0],
- (CPU_STK_SIZE)forward_STK_SIZE/10,
- (CPU_STK_SIZE)forward_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void * )0,
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR * )&err);
- //創建任務back_task
- OSTaskCreate((OS_TCB * )&back_TaskTCB,
- (CPU_CHAR * )"back_task",
- (OS_TASK_PTR )back_task,
- (void * )0,
- (OS_PRIO )back_TASK_PRIO,
- (CPU_STK * )&back_TASK_STK[0],
- (CPU_STK_SIZE)back_STK_SIZE/10,
- (CPU_STK_SIZE)back_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void * )0,
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR * )&err);
- //創建任務stop_task
- OSTaskCreate((OS_TCB * )&stop_TaskTCB,
- (CPU_CHAR * )"stop_task",
- (OS_TASK_PTR )stop_task,
- (void * )0,
- (OS_PRIO )stop_TASK_PRIO,
- (CPU_STK * )&stop_TASK_STK[0],
- (CPU_STK_SIZE)stop_STK_SIZE/10,
- (CPU_STK_SIZE)stop_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void * )0,
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR * )&err);
- //創建任務turnright_task
- OSTaskCreate((OS_TCB * )&turnright_TaskTCB,
- (CPU_CHAR * )"turnright_task",
- (OS_TASK_PTR )turnright_task,
- (void * )0,
- (OS_PRIO )turnright_TASK_PRIO,
- (CPU_STK * )&turnright_TASK_STK[0],
- (CPU_STK_SIZE)turnright_STK_SIZE/10,
- (CPU_STK_SIZE)turnright_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void * )0,
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR * )&err);
- //創建任務turnleft_task
- OSTaskCreate((OS_TCB * )&turnleft_TaskTCB,
- (CPU_CHAR * )"turnleft_task",
- (OS_TASK_PTR )turnleft_task,
- (void * )0,
- (OS_PRIO )turnleft_TASK_PRIO,
- (CPU_STK * )&turnleft_TASK_STK[0],
- (CPU_STK_SIZE)turnleft_STK_SIZE/10,
- (CPU_STK_SIZE)turnleft_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void * )0,
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR * )&err);
- //創建任務quick_task
- OSTaskCreate((OS_TCB * )&quick_TaskTCB,
- (CPU_CHAR * )"quick_task",
- (OS_TASK_PTR )quick_task,
- (void * )0,
- (OS_PRIO )quick_TASK_PRIO,
- (CPU_STK * )&quick_TASK_STK[0],
- (CPU_STK_SIZE)quick_STK_SIZE/10,
- (CPU_STK_SIZE)quick_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void * )0,
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR * )&err);
- //創建任務slow_task
- OSTaskCreate((OS_TCB * )&slow_TaskTCB,
- (CPU_CHAR * )"slow_task",
- (OS_TASK_PTR )slow_task,
- (void * )0,
- (OS_PRIO )slow_TASK_PRIO,
- (CPU_STK * )&slow_TASK_STK[0],
- (CPU_STK_SIZE)slow_STK_SIZE/10,
- (CPU_STK_SIZE)slow_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void * )0,
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR * )&err);
- //創建任務track_task
- OSTaskCreate((OS_TCB * )&track_TaskTCB,
- (CPU_CHAR * )"track_task",
- (OS_TASK_PTR )track_task,
- (void * )0,
- (OS_PRIO )track_TASK_PRIO,
- (CPU_STK * )&track_TASK_STK[0],
- (CPU_STK_SIZE)track_STK_SIZE/10,
- (CPU_STK_SIZE)track_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void * )0,
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR * )&err);
- //創建任務usartcheck_task
- OSTaskCreate((OS_TCB * )&usartcheck_TaskTCB,
- (CPU_CHAR * )"usartcheck_task",
- (OS_TASK_PTR )usartcheck_task,
- (void * )0,
- (OS_PRIO )usartcheck_TASK_PRIO,
- (CPU_STK * )&usartcheck_TASK_STK[0],
- (CPU_STK_SIZE)usartcheck_STK_SIZE/10,
- (CPU_STK_SIZE)usartcheck_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void * )0,
- (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR * )&err);
-
- OS_CRITICAL_EXIT(); //退出臨界區
- OSTaskDel((OS_TCB*)0,&err); //刪除start_task任務自身
- }
- //任務usartcheck_task的任務函數
- void usartcheck_task(void *p_arg)
- {
- OS_ERR err;
- u8 Res;
- while(1)
- {
- if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=RESET)
- {
- Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數據
- switch(Res)//
- {
- case 'A'://前進
- {
- OSSemPost(&forward_SEM,OS_OPT_POST_1,&err); //發送信號量forward_SEM
- break;
- }
- case 'b'://后退
- {
- OSSemPost(&back_SEM,OS_OPT_POST_1,&err); //發送信號量back_SEM
- break;
- }
- case 'C'://停止
- {
- OSSemPost(&stop_SEM,OS_OPT_POST_1,&err); //發送信號量stop_SEM
- break;
- }
- case 'r'://右轉
- {
- OSSemPost(&turnright_SEM,OS_OPT_POST_1,&err);//發送信號量turnright_SEM
- break;
- }
- case 'l'://左轉
- {
- OSSemPost(&turnleft_SEM,OS_OPT_POST_1,&err); //發送信號量turnleft_SEM
- break;
- }
- case 'k'://加速
- {
- OSSemPost(&quick_SEM,OS_OPT_POST_1,&err); //發送信號量quick_SEM
- break;
- }
- case 'm'://減速
- {
- OSSemPost(&slow_SEM,OS_OPT_POST_1,&err); //發送信號量slow_SEM
- break;
- }
- case 't'://循跡
- {
- OSSemPost(&track_SEM,OS_OPT_POST_1,&err); //發送信號量track_SEM
- break;
- }
- default: break;
- }
- }
- }
- }
- //任務forward_task的任務函數
- void forward_task(void *p_arg)
- {
- OS_ERR err;
- OSSemPend(&forward_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號量
- forward(ini_ccr);
- }
- //任務back_task的任務函數
- void back_task(void *p_arg)
- {
- OS_ERR err;
- OSSemPend(&back_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號量
- back(ini_ccr);
- }
- //任務stop_task的任務函數
- void stop_task(void *p_arg)
- {
- OS_ERR err;
- OSSemPend(&stop_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號量
- stop();
- }
- //任務turnright_task的任務函數
- void turnright_task(void *p_arg)
- {
- OS_ERR err;
- OSSemPend(&turnright_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);//等待信號量
- turn_right();
- }
- //任務turnleft_task的任務函數
- void turnleft_task(void *p_arg)
- {
- OS_ERR err;
- OSSemPend(&turnleft_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號量
- turn_left();
- }
- //任務quick_task的任務函數
- void quick_task(void *p_arg)
- {
- OS_ERR err;
- OSSemPend(&quick_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號量
- quick();
- }
- //任務slow_task的任務函數
- void slow_task(void *p_arg)
- {
- OS_ERR err;
- OSSemPend(&slow_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號量
- slow();
- }
- //任務track_task的任務函數
- void track_task(void *p_arg)
- {
- OS_ERR err;
- OSSemPend(&track_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號量
- while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET)
- {
- track();
- }
- }
復制代碼
所有資料51hei提供下載:
STM32小車(2016嵌入式小車)3 - ucosiii - inquire(sem).7z
(393.08 KB, 下載次數: 81)
2019-1-14 03:17 上傳
點擊文件名下載附件
|