硬體 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就會被執行。而且...