原文網址: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中加入
- #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的主要代碼如下:
- /*----------------------------------------------------------------------------
- * Task 1
- *---------------------------------------------------------------------------*/
- __task void task1 (void) {
- for (;;) {
- led1on(); //點亮LED1,函數具體內容依照你的開發板
- os_dly_wait (10);
- led1off(); //熄滅LED1
- os_dly_wait (10);
- }
- }
- /*----------------------------------------------------------------------------
- * Task 2
- *---------------------------------------------------------------------------*/
- __task void task2 (void) {
- for (;;) {
- led2off(); //熄滅LED2,函數具體內容依照你的開發板
- os_dly_wait (10);
- led2on();
- os_dly_wait (10);
- }
- }
- /*----------------------------------------------------------------------------
- * Task 'init': 建立所有的任務
- *---------------------------------------------------------------------------*/
- __task void init_task (void) {
- id1 = os_tsk_create (task1, 0); /* start
task phaseA */
- id2 = os_tsk_create (task2, 0); /* start
task phaseB */
- os_tsk_delete_self ();
- }
- int main(void)
- {
- /*!< At this stage the microcontroller clock setting is already
configured,
- this is done through SystemInit() function which is called
from startup
- file (startup_stm32f10x_xx.s) before to branch to application
main.
- To reconfigure the default setting of SystemInit() function, refer to
- system_stm32f10x.c file
- */
-
- /* To achieve GPIO toggling maximum frequency, the following sequence is mandatory.
- You can monitor PD0 or PD2 on the scope to measure the output signal.
- If you need to fine tune this frequency, you can add more GPIO set/reset
- cycles to minimize more the infinite loop timing.
- This code needs to be compiled with high speed optimization option.
- */
- GPIO_Config(); //IO口初始化函數,具體根據你的開發板
- os_sys_init (init_task);
- }
說明:編譯時如果提示有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開始支持時間片輪轉調度。