標(biāo)題:
UCOSIII控制STM32 wifi小車代碼
[打印本頁]
作者:
jijkf
時(shí)間:
2019-1-14 00:04
標(biāo)題:
UCOSIII控制STM32 wifi小車代碼
對(duì)于ucos敢興趣朋友,可以參考這例程,我這使用信號(hào)量,然后直接控制為wifi小車
單片機(jī)源程序如下:
#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中以下優(yōu)先級(jí)用戶程序不能使用,ALIENTEK
//將這些優(yōu)先級(jí)分配給了UCOSIII的5個(gè)系統(tǒng)內(nèi)部任務(wù)
//優(yōu)先級(jí)0:中斷服務(wù)服務(wù)管理任務(wù) OS_IntQTask()
//優(yōu)先級(jí)1:時(shí)鐘節(jié)拍任務(wù) OS_TickTask()
//優(yōu)先級(jí)2:定時(shí)任務(wù) OS_TmrTask()
//優(yōu)先級(jí)OS_CFG_PRIO_MAX-2:統(tǒng)計(jì)任務(wù) OS_StatTask()
//優(yōu)先級(jí)OS_CFG_PRIO_MAX-1:空閑任務(wù) OS_IdleTask()
#define START_TASK_PRIO 3 //任務(wù)優(yōu)先級(jí)
#define START_STK_SIZE 1024 //任務(wù)堆棧大小
OS_TCB StartTaskTCB; //任務(wù)控制塊
CPU_STK START_TASK_STK[START_STK_SIZE];//任務(wù)堆棧
void start_task(void *p_arg); //任務(wù)函數(shù)
#define forward_TASK_PRIO 4 //任務(wù)優(yōu)先級(jí)
#define forward_STK_SIZE 128 //任務(wù)堆棧大小
OS_TCB forward_TaskTCB; //任務(wù)控制塊
CPU_STK forward_TASK_STK[forward_STK_SIZE];//任務(wù)堆棧
void forward_task(void *p_arg); //任務(wù)函數(shù)
#define back_TASK_PRIO 5 //任務(wù)優(yōu)先級(jí)
#define back_STK_SIZE 128 //任務(wù)堆棧大小
OS_TCB back_TaskTCB; //任務(wù)控制塊
CPU_STK back_TASK_STK[back_STK_SIZE];//任務(wù)堆棧
void back_task(void *p_arg); //任務(wù)函數(shù)
#define stop_TASK_PRIO 6 //任務(wù)優(yōu)先級(jí)
#define stop_STK_SIZE 128 //任務(wù)堆棧大小
OS_TCB stop_TaskTCB; //任務(wù)控制塊
CPU_STK stop_TASK_STK[stop_STK_SIZE];//任務(wù)堆棧
void stop_task(void *p_arg); //任務(wù)函數(shù)
#define turnright_TASK_PRIO 7 //任務(wù)優(yōu)先級(jí)
#define turnright_STK_SIZE 128 //任務(wù)堆棧大小
OS_TCB turnright_TaskTCB; //任務(wù)控制塊
CPU_STK turnright_TASK_STK[turnright_STK_SIZE];//任務(wù)堆棧
void turnright_task(void *p_arg); //任務(wù)函數(shù)
#define turnleft_TASK_PRIO 8 //任務(wù)優(yōu)先級(jí)
#define turnleft_STK_SIZE 128 //任務(wù)堆棧大小
OS_TCB turnleft_TaskTCB; //任務(wù)控制塊
CPU_STK turnleft_TASK_STK[turnleft_STK_SIZE]; //任務(wù)堆棧
void turnleft_task(void *p_arg); //任務(wù)函數(shù)
#define quick_TASK_PRIO 9 //任務(wù)優(yōu)先級(jí)
#define quick_STK_SIZE 128 //任務(wù)堆棧大小
OS_TCB quick_TaskTCB; //任務(wù)控制塊
CPU_STK quick_TASK_STK[quick_STK_SIZE];//任務(wù)堆棧
void quick_task(void *p_arg); //任務(wù)函數(shù)
#define slow_TASK_PRIO 10 //任務(wù)優(yōu)先級(jí)
#define slow_STK_SIZE 128 //任務(wù)堆棧大小
OS_TCB slow_TaskTCB; //任務(wù)控制塊
CPU_STK slow_TASK_STK[slow_STK_SIZE]; //任務(wù)堆棧
void slow_task(void *p_arg); //任務(wù)函數(shù)
#define track_TASK_PRIO 11 //任務(wù)優(yōu)先級(jí)
#define track_STK_SIZE 128 //任務(wù)堆棧大小
OS_TCB track_TaskTCB; //任務(wù)控制塊
CPU_STK track_TASK_STK[track_STK_SIZE];//任務(wù)堆棧
void track_task(void *p_arg); //任務(wù)函數(shù)
#define usartcheck_TASK_PRIO 12 //任務(wù)優(yōu)先級(jí)
#define usartcheck_STK_SIZE 128 //任務(wù)堆棧大小
OS_TCB usartcheck_TaskTCB; //任務(wù)控制塊
CPU_STK usartcheck_TASK_STK[usartcheck_STK_SIZE];//任務(wù)堆棧
void usartcheck_task(void *p_arg); //任務(wù)函數(shù)
OS_SEM forward_SEM; //定義信號(hào)量
OS_SEM back_SEM; //定義信號(hào)量
OS_SEM stop_SEM; //定義信號(hào)量
OS_SEM turnright_SEM;//定義信號(hào)量
OS_SEM turnleft_SEM; //定義信號(hào)量
OS_SEM quick_SEM; //定義信號(hào)量
OS_SEM slow_SEM; //定義信號(hào)量
OS_SEM track_SEM; //定義信號(hào)量
//s16 ini_ccr=60;//賦值給比較捕獲寄存器CCR的初值
//s16 com_ccr=60;//賦值給比較捕獲寄存器CCR的公共值
//主函數(shù)
int main(void)
{
OS_ERR err;
CPU_SR_ALLOC();
delay_init(); //時(shí)鐘初始化
//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(); //進(jìn)入臨界區(qū)
//創(chuàng)建開始任務(wù)
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任務(wù)控制塊
(CPU_CHAR * )"start task", //任務(wù)名字
(OS_TASK_PTR )start_task, //任務(wù)函數(shù)
(void * )0, //傳遞給任務(wù)函數(shù)的參數(shù)
(OS_PRIO )START_TASK_PRIO, //任務(wù)優(yōu)先級(jí)
(CPU_STK * )&START_TASK_STK[0], //任務(wù)堆;刂
(CPU_STK_SIZE)START_STK_SIZE/10, //任務(wù)堆棧深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任務(wù)堆棧大小
(OS_MSG_QTY )0, //任務(wù)內(nèi)部消息隊(duì)列能夠接收的最大消息數(shù)目,為0時(shí)禁止接收消息
(OS_TICK )0, //當(dāng)使能時(shí)間片輪轉(zhuǎn)時(shí)的時(shí)間片長度,為0時(shí)為默認(rèn)長度,
(void * )0, //用戶補(bǔ)充的存儲(chǔ)區(qū)
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務(wù)選項(xiàng)
(OS_ERR * )&err); //存放該函數(shù)錯(cuò)誤時(shí)的返回值
OS_CRITICAL_EXIT(); //退出臨界區(qū)
OSStart(&err); //開啟UCOSIII
}
//開始任務(wù)函數(shù)
void start_task(void *p_arg)//void *p_arg是空類型(無類型)指針,由函數(shù)內(nèi)部強(qiáng)制轉(zhuǎn)換為某一具體類型的指針
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;//表示暫時(shí)不用p_arg,防止編譯器告警
//(void)p_arg;//表示暫時(shí)不用p_arg,防止編譯器告警
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //統(tǒng)計(jì)任務(wù)
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了測量中斷關(guān)閉時(shí)間
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //當(dāng)使用時(shí)間片輪轉(zhuǎn)的時(shí)候
//使能時(shí)間片輪轉(zhuǎn)調(diào)度功能,時(shí)間片長度為1個(gè)系統(tǒng)時(shí)鐘節(jié)拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
OS_CRITICAL_ENTER(); //進(jìn)入臨界區(qū)
OSSemCreate ((OS_SEM* )&forward_SEM, //創(chuàng)建信號(hào)量forward_SEM
(CPU_CHAR* )"forward_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
OSSemCreate ((OS_SEM* )&back_SEM, //創(chuàng)建信號(hào)量back_SEM
(CPU_CHAR* )"back_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
OSSemCreate ((OS_SEM* )&stop_SEM, //創(chuàng)建信號(hào)量stop_SEM
(CPU_CHAR* )"stop_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
OSSemCreate ((OS_SEM* )&turnright_SEM, //創(chuàng)建信號(hào)量turnright_SEM
(CPU_CHAR* )"turnright_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
OSSemCreate ((OS_SEM* )&turnleft_SEM, //創(chuàng)建信號(hào)量turnleft_SEM
(CPU_CHAR* )"turnleft_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
OSSemCreate ((OS_SEM* )&quick_SEM, //創(chuàng)建信號(hào)量quick_SEM
(CPU_CHAR* )"quick_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
OSSemCreate ((OS_SEM* )&slow_SEM, //創(chuàng)建信號(hào)量slow_SEM
(CPU_CHAR* )"slow_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
OSSemCreate ((OS_SEM* )&track_SEM, //創(chuàng)建信號(hào)量track_SEM
(CPU_CHAR* )"track_SEM",
(OS_SEM_CTR)0,
(OS_ERR* )&err);
//創(chuàng)建任務(wù)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);
//創(chuàng)建任務(wù)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);
//創(chuàng)建任務(wù)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);
//創(chuàng)建任務(wù)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);
//創(chuàng)建任務(wù)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);
//創(chuàng)建任務(wù)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);
//創(chuàng)建任務(wù)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);
//創(chuàng)建任務(wù)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);
//創(chuàng)建任務(wù)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(); //退出臨界區(qū)
OSTaskDel((OS_TCB*)0,&err); //刪除start_task任務(wù)自身
}
//任務(wù)usartcheck_task的任務(wù)函數(shù)
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); //讀取接收到的數(shù)據(jù)
switch(Res)//
{
case 'A'://前進(jìn)
{
OSSemPost(&forward_SEM,OS_OPT_POST_1,&err); //發(fā)送信號(hào)量forward_SEM
break;
}
case 'b'://后退
{
OSSemPost(&back_SEM,OS_OPT_POST_1,&err); //發(fā)送信號(hào)量back_SEM
break;
}
case 'C'://停止
{
OSSemPost(&stop_SEM,OS_OPT_POST_1,&err); //發(fā)送信號(hào)量stop_SEM
break;
}
case 'r'://右轉(zhuǎn)
{
OSSemPost(&turnright_SEM,OS_OPT_POST_1,&err);//發(fā)送信號(hào)量turnright_SEM
break;
}
case 'l'://左轉(zhuǎn)
{
OSSemPost(&turnleft_SEM,OS_OPT_POST_1,&err); //發(fā)送信號(hào)量turnleft_SEM
break;
}
case 'k'://加速
{
OSSemPost(&quick_SEM,OS_OPT_POST_1,&err); //發(fā)送信號(hào)量quick_SEM
break;
}
case 'm'://減速
{
OSSemPost(&slow_SEM,OS_OPT_POST_1,&err); //發(fā)送信號(hào)量slow_SEM
break;
}
case 't'://循跡
{
OSSemPost(&track_SEM,OS_OPT_POST_1,&err); //發(fā)送信號(hào)量track_SEM
break;
}
default: break;
}
}
}
}
//任務(wù)forward_task的任務(wù)函數(shù)
void forward_task(void *p_arg)
{
OS_ERR err;
OSSemPend(&forward_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號(hào)量
forward(ini_ccr);
}
//任務(wù)back_task的任務(wù)函數(shù)
void back_task(void *p_arg)
{
OS_ERR err;
OSSemPend(&back_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號(hào)量
back(ini_ccr);
}
//任務(wù)stop_task的任務(wù)函數(shù)
void stop_task(void *p_arg)
{
OS_ERR err;
OSSemPend(&stop_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號(hào)量
stop();
}
//任務(wù)turnright_task的任務(wù)函數(shù)
void turnright_task(void *p_arg)
{
OS_ERR err;
OSSemPend(&turnright_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);//等待信號(hào)量
turn_right();
}
//任務(wù)turnleft_task的任務(wù)函數(shù)
void turnleft_task(void *p_arg)
{
OS_ERR err;
OSSemPend(&turnleft_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號(hào)量
turn_left();
}
//任務(wù)quick_task的任務(wù)函數(shù)
void quick_task(void *p_arg)
{
OS_ERR err;
OSSemPend(&quick_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號(hào)量
quick();
}
//任務(wù)slow_task的任務(wù)函數(shù)
void slow_task(void *p_arg)
{
OS_ERR err;
OSSemPend(&slow_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號(hào)量
slow();
}
//任務(wù)track_task的任務(wù)函數(shù)
void track_task(void *p_arg)
{
OS_ERR err;
OSSemPend(&track_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信號(hào)量
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET)
{
track();
}
}
復(fù)制代碼
所有資料51hei提供下載:
STM32小車(2016嵌入式小車)3 - ucosiii - inquire(sem).7z
(393.08 KB, 下載次數(shù): 81)
2019-1-14 03:17 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時(shí)間:
2019-1-14 03:18
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者:
zixiaguying
時(shí)間:
2019-6-12 16:47
這么好的東西當(dāng)然要下載啦
作者:
黑魔力
時(shí)間:
2019-6-15 00:02
剛好可以用上
作者:
黑魔力
時(shí)間:
2019-6-21 23:57
好多東西都沒說,比如引腳接法,怎么用,有什么用
作者:
wind666
時(shí)間:
2019-7-29 15:46
這么好的東西當(dāng)然要下載啦
作者:
wliuxiaoxiaow
時(shí)間:
2019-9-6 23:26
這是stm32F103單片機(jī)的嗎
作者:
9291806
時(shí)間:
2019-9-16 11:00
學(xué)習(xí)UCOS中,正好用上,謝謝@!
作者:
vlivli
時(shí)間:
2019-9-19 15:33
學(xué)習(xí)UCOS中,正好用上。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1