KEIL RTX_Kernel使用

原文網址:http://blog.chinaunix.net/uid-26616767-id-3056793.html

前言:本人使用的是STM32F103VC開發板,標準的8MHz晶振,72MHz主頻運行。

    用M3處理器的話,不用實時操作系統顯得太沒效率了。正好也看到Micrium官方把uC/OS-III的源代碼放出來了。於是從官網下了一個針對STM32F版本的uC/OS-III,修改了下里面的任務函數,改成點亮發光二極管,編譯下載後不執行。一看Micrium官方這個版本是針對STM32F107的,互聯網型,標準晶振是25MHz,我想可能是頻率設置不對,我也不想去探索如何解決。

    我從Keil官網上下載最新的MDK423,看到裏面關於RTX_Kernel的介紹。以前寫51單片機程序的時候知道RTX這個東西,但從來沒用過。這次打算用下RTX_Kernel試試,畢竟RTX_Kernel是商用免費的,uC/OS是商用收費的。另外是ARM Keil自家的東西,想必也不錯。

正式開始我的RTX_Kernel使用例程:

1、我的Keil MDK版本是此時從官網下載的最新版本MDK423,之前的Keil註冊機在這裏可用。

2、在ST官方網站下載STM32F10x_StdPeriph_Lib_V3.5.0,用這裏面的工程作爲工程模板。

3、依據ST官方庫的例子,建立一個GPIO/IOToggle 工程。修改裏面的IO端口與你的板子匹配。編譯運行成功。

4、開始使用RTX_Kernel。在main.c中加入

  1. #inlude <rtl.h>

項目選項裏,在Target下,Operating system選擇 RTX Kernel複製

D:\Keil\ARM\Boards\ST\STM32F10X_EVAL\RTX_Blinky\RTX_Config.h到項目目錄下,並將RTX_Config.h添加到項目中。

然後main.c的主要代碼如下:

  1. /*----------------------------------------------------------------------------
  2.  * Task 1 
  3.  *---------------------------------------------------------------------------*/
  4. __task void task1 (void) {
  5.   for (;;) {
  6.     led1on();    //點亮LED1,函數具體內容依照你的開發板
  7.     os_dly_wait (10);
  8.     led1off();    //熄滅LED1
  9.     os_dly_wait (10);
  10.   }
  11. }
  12. /*----------------------------------------------------------------------------
  13.  * Task 2 
  14.  *---------------------------------------------------------------------------*/
  15. __task void task2 (void) {
  16.   for (;;) {
  17.     led2off();     //熄滅LED2,函數具體內容依照你的開發板
  18.     os_dly_wait (10);
  19.     led2on();
  20.     os_dly_wait (10);
  21.   }
  22. }
  23. /*----------------------------------------------------------------------------
  24.  * Task  'init': 建立所有的任務
  25.  *---------------------------------------------------------------------------*/
  26. __task void init_task (void) {

  27.   id1 = os_tsk_create (task1, 0); /* start task phaseA */
  28.   id2 = os_tsk_create (task2, 0); /* start task phaseB */
  29.   os_tsk_delete_self ();
  30. }
  31. int main(void)
  32. {
  33.   /*!< At this stage the microcontroller clock setting is already configured, 
  34.        this is done through SystemInit() function which is called from startup
  35.        file (startup_stm32f10x_xx.s) before to branch to application main.
  36.        To reconfigure the default setting of SystemInit() function, refer to
  37.        system_stm32f10x.c file
  38.      */ 
  39.        
  40.   /* To achieve GPIO toggling maximum frequency, the following sequence is mandatory. 
  41.      You can monitor PD0 or PD2 on the scope to measure the output signal. 
  42.      If you need to fine tune this frequency, you can add more GPIO set/reset 
  43.      cycles to minimize more the infinite loop timing.
  44.      This code needs to be compiled with high speed optimization option. 
  45.      */

  46.     GPIO_Config();    //IO口初始化函數,具體根據你的開發板
  47.     os_sys_init (init_task);

  48. }
    上面代碼很簡單,不用解釋,一看即明白。編譯,運行,會看到兩個發光二極管一閃一閃的。恭喜你,RTX Kernel成功運行了!

    說明:編譯時如果提示有3個函數定義衝突,在stm32f10x_it.c中屏蔽掉那三個函數即可。

5、RTX Kernel教程

    實際上RTX Kernel API比較簡單,相對於uC/OS-III而言。有一些uc/OS的基礎的話,參照Keil幫助文檔和rtl.h頭文件,即可輕鬆使用RTX的API。簡要總結如下:

    首先說明一點,RTX是時間片輪轉調度的,即相同任務優先級每個任務分得一定的時間片運行。uC/OS-II是不支持時間片輪轉的,uC/OS-III開始支持時間片輪轉調度。

(1)事件管理:os_evt_wait_and(), os_evt_wait_or()
              os_evt_set()
              isr_evt_set()
    讓一個進程等待一個事件,這個事件可以由其它進程和中斷觸發。

(2)郵箱管理: os_mbx_declare(), os_mbx_init()
                   os_mbx_wait()
                   os_mbx_send(), isr_mbx_send()
    建立一個郵箱,裏面可以存放一定數目的消息(比如20條)。進程可以等待郵箱隊列,如果郵箱裏有消息,則取出,進程繼續執行;如果郵箱爲空,則繼續等待。

(3)互斥管理:os_mut_init ()
                            os_mut_wait()  //上鎖
                            os_mut_release()  //解鎖
    進程獨佔的資源,加個鎖,別的進程需要等待。

(4)信號量管理:os_sem_init, os_sem_send, os_sem_wait, isr_sem_send
    信號量與事件類似,進程等待的信號量大於0時,進程繼續執行,信號量-1。發送信號量時,信號量+1.

(5)延時: os_dly_wait(),延時指定數目的系統節拍事件。

整個RTX Kernel組成圖如下:
RTX Overview

6、中斷
    中斷函數的編寫與非RTX程序一樣,注意中斷及時的返回,不要發生意外嵌套。

7、小結
    RTX的使用明顯比uC/OS容易些,如果在M3下使用RTOS的話,個人感覺優先RTX。至於具體的RTX學習資料,Keil參考手冊和rtl.h頭文件這兩個文檔足矣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章