STM32下使用Keil自帶的RTL
Keil ARTX(Advanced Real-Time eXecutive)是Keil為ARM 系列所提供的一個小型實時操作系統,整合于其UV3開發環境之中.在下載并安裝了RealView MDK個人學習版后,ARTX同時安裝到了C:KeilARMRLRTX目錄下,在C:KeilARMBoardsKeilMCBSTM32STLIB_RTX_Blinky目錄下有STM32的例子程序。經過簡單修改,運行在萬利開發板上。
#include
#include
OS_TID t_phaseA; //分配任務ID號
OS_TID t_phaseB;
OS_TID t_phaseC;
OS_TID t_phaseD;
#define LED_A GPIO_Pin_4
#define LED_B GPIO_Pin_5
#define LED_C GPIO_Pin_6
#define LED_D GPIO_Pin_7
#define LED_On(led) GPIO_SetBits(GPIOC, led)
#define LED_Off(led) GPIO_ResetBits(GPIOC, led)
extern void SetupClock (void);
extern void SetupLED (void);
void phaseA (void) __task {
for (;;) {
LED_On (LED_A);
os_dly_wait (100);
LED_Off(LED_A);
os_dly_wait (100);
}
}
void phaseB (void) __task {
for (;;) {
LED_On (LED_B);
os_dly_wait (100);
LED_Off(LED_B);
os_dly_wait (100);
}
}
void phaseC (void) __task {
for (;;) {
LED_On (LED_C);
os_dly_wait (100);
LED_Off(LED_C);
os_dly_wait (100);
}
}
void phaseD (void) __task {
for (;;) {
LED_On (LED_D);
os_dly_wait (100);
LED_Off(LED_D);
os_dly_wait (100);
}
}
void init (void) __task {
t_phaseA = os_tsk_create (phaseA, 0);
os_dly_wait (50);
t_phaseB = os_tsk_create (phaseB, 0);
os_dly_wait (50);
t_phaseC = os_tsk_create (phaseC, 0);
os_dly_wait (50);
t_phaseD = os_tsk_create (phaseD, 0);
os_tsk_delete_self ();
}
int main (void) {
SetupClock();
SetupLED ();
os_sys_init (init);
}
經過初試化后,os_sys_init (init)啟動了初試化任務。在初試化任務中,又先后啟動了4個任務,啟動后,
刪除初試化任務。這4個任務各自控制一個LED的開關。
============================================
個人理解:
int main(void)
{
}
問1:為什么在TaskMain里面創建很多小任務不在下面繼續調用os_sys_init_user( ); 這個API呢?原因是因為初始化TaskMain之后不再返回了,所以他也執行不到下面while
問2:TaskMain 里面創建的小任務,而小任務里面也都是有while(1)死循環,這就是多線程的概念。除了while(1)其他也都是只執行一次,包括主函數和小任務里面的變量,只有while(1)是時間片和優先級運行,實現多線程執行。
評論