UCOSIII系統學習 STM32

2021-09-25 17:28:14 字數 3975 閱讀 7262

硬體 stm32f103c8t6

軟體 正點原子stm32f103 裸機程式+ucosiii系統程式

本文主要是描述ucosiii系統的優點和特點

有嵌入式經驗的同胞們都知道,多工處理時,最好的方法就是建立程序和執行緒,我個人拙見,

ucos系統就是因為stm32無法跑gcc,而且微控制器都是單核單執行緒,從前我們想做更多工的時候,都是建立定時器,將不同的任務放到各個定時器裡面跑,這樣就實現了類似多執行緒並行奔跑的場景,雖然定時器很多; 而ucos系統就是類似定時器,類似執行緒,只需要將需要的任務,建立好,

按照優先順序不同設定,系統就會定時進行任務執行,可謂是腳踏實地的執行各種並行任務.

這個了解stm32的都知道,直接移植就好了

(1) 開始程序

該程序是必須的程序,猶如父程序,整個系統的爸爸

定義開始程序

#define start_task_prio		3   //任務優先順序

#define start_stk_size 512 //任務堆疊大小 ,這個看整個系統任務的情況而定

os_tcb starttasktcb; //任務控制塊

cpu_stk start_task_stk[start_stk_size]; //任務堆疊

void start_task(void *p_arg); //任務函式

建立開始任務函式

//開始任務函式

void start_task(void *p_arg)

主函式來來掛載開始程序

int main(void)

(2) 時間統計程序-用於記錄每次系統啟動時間

//用於記錄每次系統啟動時間

#define time_task_prio 4 //任務優先順序

#define time_stk_size 128 //任務堆疊大小

os_tcb time_tasktcb; //任務控制塊

cpu_stk time_task_stk[time_stk_size]; //任務堆疊

void time_task(void *p_arg);

任務實現

//time計時任務函式

void time_task(void *p_arg)}}

掛載到系統中,在start_task()函式中

os_critical_enter();	//進入臨界區

ostaskcreate((os_tcb * )&time_tasktcb,

(cpu_char * )"time_ task",

(os_task_ptr )time_task,

(void * )0,

(os_prio )time_task_prio,

(cpu_stk * )&time_task_stk[0],

(cpu_stk_size)time_stk_size/10,

(cpu_stk_size)time_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_tasksuspend((os_tcb*)&starttasktcb,&err); //掛起開始任務

os_critical_exit(); //退出臨界區

ostaskdel((os_tcb*)&led1tasktcb, &err);

void led0_task(void *p_arg)

}}

os_tasksuspend((os_tcb*)&floattasktcb,&err);//掛起任務

os_taskresume((os_tcb*)&floattasktcb,&err);//重新啟動任務

void led0_task(void *p_arg)

if(task_num == 20)

if(task_num == 25)

}}

(1)定義兩個任務向量

//優先順序都為8,用於測試時間片

#define task1_task_prio 8 //任務優先順序

#define task1_stk_size 128 //任務堆疊大小

os_tcb task1_tasktcb; //任務控制塊

cpu_stk task1_task_stk[task1_stk_size]; //任務堆疊

void task1_task(void *p_arg); //任務函式

#define task2_task_prio		8   //任務優先順序

#define task2_stk_size 128 //任務堆疊大小

os_tcb task2_tasktcb; //任務控制塊

cpu_stk task2_task_stk[task2_stk_size]; //任務堆疊

void task2_task(void *p_arg); //任務函式

(2) void start_task(void *p_arg)中加入上面兩個任務
//建立task1測試任務

ostaskcreate((os_tcb * )&task1_tasktcb,

(cpu_char * )"task1_t task",

(os_task_ptr )task1_task,

(void * )0,

(os_prio )task1_task_prio,

(cpu_stk * )&task1_task_stk[0],

(cpu_stk_size)task1_stk_size/10,

(cpu_stk_size)task1_stk_size,

(os_msg_qty )0,

(os_tick )2, //時間片長度2*5 = 10ms

(void * )0,

(os_opt )os_opt_task_stk_chk|os_opt_task_stk_clr,

(os_err * )&err);

//建立task1測試任務

ostaskcreate((os_tcb * )&task2_tasktcb,

(cpu_char * )"task2_t task",

(os_task_ptr )task2_task,

(void * )0,

(os_prio )task2_task_prio,

(cpu_stk * )&task2_task_stk[0],

(cpu_stk_size)task2_stk_size/10,

(cpu_stk_size)task2_stk_size,

(os_msg_qty )0,

(os_tick )2, //時間片長度2*5 = 10ms

(void * )0,

(os_opt )os_opt_task_stk_chk|os_opt_task_stk_clr,

(os_err * )&err);

STM3 實現串列埠通訊 庫函式版

串列埠設定的一般步驟可以總結為如下幾個步驟 串列埠時鐘使能,gpio 時鐘使能 串列埠是掛載在 apb2 下面的外設,所以使能函式為 rcc apb2periphclockcmd rcc apb2periph usart1 串列埠復位 當外設出現異常的時候可以通過復位設定,實現該外設的復位,然後重新...

STM32系統學習 SysTick(系統定時器)

systick系統定時器是屬於cm3核心中的乙個外設,內嵌在nvic 巢狀向量中斷控制器,控制整個晶元中斷相關的功能,它與核心緊密藕合,是核心中的乙個外設 中。系統定時器是乙個24位的向下遞減的計數器,計數器每計數一次的時間為1 sysclk,一般我們設定系統時鐘sysclk為72mhz,當重裝載數...

檔案系統學習(3)

一 說在前面 在嵌入式中呢,首先uboot的最終目的是啟動我們的核心,核心的目的是啟動我們的應用程式。怎麼啟動的呢?我們來分析下init post 這個函式 static int noinline init post void 如果uboot中的bootargs中有設定init,if就會被執行。而且...