新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32下使用Keil自帶的RTL

        STM32下使用Keil自帶的RTL

        作者: 時間:2016-11-24 來源:網絡 收藏
        初次使用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個任務,啟動后,

        本文引用地址:http://www.104case.com/article/201611/321061.htm

        刪除初試化任務。這4個任務各自控制一個LED的開關。

        ============================================

        個人理解:

        int main(void)

        {

        os_sys_init_user( TaskMain,

        50,

        TaskSysInitStack,

        SysInitTaskStakSize );

        while(1);

        }

        問1:為什么在TaskMain里面創建很多小任務不在下面繼續調用os_sys_init_user( ); 這個API呢?原因是因為初始化TaskMain之后不再返回了,所以他也執行不到下面while 了。

        問2:TaskMain 里面創建的小任務,而小任務里面也都是有while(1)死循環,這就是多線程的概念。除了while(1)其他也都是只執行一次,包括主函數和小任務里面的變量,只有while(1)是時間片和優先級運行,實現多線程執行。



        關鍵詞: STM32KeilRT

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 灯塔市| 青河县| 天门市| 河西区| 灵川县| 石林| 西和县| 汝城县| 夏津县| 镇坪县| 公主岭市| 齐齐哈尔市| 安龙县| 札达县| 河北区| 玉树县| 岚皋县| 成都市| 许昌市| 南昌市| 科尔| 临泽县| 赤水市| 曲阜市| 海林市| 鄂托克前旗| 天门市| 台东县| 防城港市| 龙江县| 简阳市| 收藏| 江陵县| 天水市| 江阴市| 彭泽县| 济阳县| 登封市| 云阳县| 重庆市| 盘锦市|