GD32L233C-START評測系列
兆易創新GD32L233系列全新低功耗MCU的最高主頻為64MHz,集成了64-256KB的嵌入式eFlash和16-32KB的SRAM,以及連接到兩條APB總線的各類增強型I/O和外設資源。芯片持續采用行業領先的Arm Cortex-M23內核,通過精簡強大的Armv8-M指令集和全面優化的總線設計帶來高效處理能力,包含獨立的乘法器和除法器,廣泛適用于工業表計、小型消費電子設備、便攜式醫療設備、電池管理系統、數據采集與傳輸等典型市場。
評測主角:GD32L233C-START 評估板 使用 GD32L233CCT6 作為主控制器,使用 GD-Link Mini USB 接口提供 5V 電源,提供包括擴展引腳在內的及Reset、Boot、Button key、LED、USB、USART 轉 USB 接口等外設資源。下載程序到評估板需要使用 GD-Link 工具,所有例程提供了Keil 和IAR 兩個版本。
移植RT-Thread至GD32L233
本文將嘗試使用國產的嵌入式實時操作系統RT-Thread,相比較于FreeRTOS,RT-Thread還是有很多有點的,比如有Fish命令行界面,國產開源免費,Nano版本代碼量極小,移植起來非常簡單(比freeRTOS移植還簡單)等,本文將講解如何將RT-Thread Nano移植到GD32L233C。
一、獲取RT-Thread基于KEIL的離線安裝包
https://www.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.5.pack
下載之后雙擊安裝即可。
二、添加RT-Thread Nano到工程
1. 打開我們自己的工程,在我的GD32L233C的第二篇帖子中,講解了如何創建一個全新的工程,本文將會在上一篇創建的工程的基礎上添加RT-Thread OS,觀看上一篇帖子請移步:http://bbs.eeworld.com.cn/thread-1192155-1-1.html
2. 點擊 Manage Run-Time Environment,展開RTOS,勾上kernel
3. 點擊OK,我們可以看到KEIL已經自動為我們添加了Cortex-M23相關的內核源碼,這點還是很方便,很人性化的,不用我們在手動修改了。
查看官方的文檔堆各個文件都有具體的描述:
三、修改文件適配Rt-Thread
我們需要修改HardFault_Handler()和 PendSV_Handler(),這兩個文件是由RT-Thread實現的,所以我們工程里面原來的這兩個函數都需要刪除掉,屏蔽掉這兩個函數的申明和定義:
四、修改系統時鐘
RT-Thread已經為我們寫好了時鐘節拍函數rt_os_tick_callback(), 在board.c文件中,我們只需要將這個函數放置到SysTick_Handler()中即可,注意需要刪除SysTick_Handler()中的原有內容。
刪除rt_hw_board_init()函數中的#error信息,這個函數在board.c文件中,其目的是提醒用戶移植的時候不要忘了心跳節拍的移植,這點還是很人性化的,免得移植了半天發現不工作。
五、修改時鐘節拍
RT-Thread為我們提供的配置文件的時鐘節拍是1000,也就是1ms,如果你想要修改心跳節拍,可以在rtconfig.h中修改這個宏RT_TICK_PER_SECOND,目前是1000,如果想修改節拍為10ms,則修改該值為10000,修改的時候最好不要直接修改rtconfig.h這個文件,因為KEIL提供了配置界面修改,在配置界面修改安全可靠。
六、創建線程測試移植是否成功
經過了上面的步驟,我們的移植已經算是完成了,接下來就是寫程序驗證了,像上一篇帖子一樣,我們寫兩個LED動作的線程,LED1 100ms閃爍一次,LED2500ms閃爍一次來做對比,別忘了修改LED燈的引腳,上一篇帖子已經說明白了,引腳不對,需要我們自己修改,如下:
在main.c中寫兩個線程,如下:
#include "gd32l23x.h"#include "systick.h"#include#include "main.h"#include "gd32l233r_eval.h"#include static rt_thread_t led1_thr = RT_NULL;static rt_thread_t led2_thr = RT_NULL; static void thread_led1_entry(void *parameter);static void thread_led2_entry(void *parameter); /*! rief main function param[in] none param[out] none etval none*/ int main(void){ /* configure systick */ systick_config(); /* initilize the LEDs, USART and key */ gd_eval_led_init(LED1); gd_eval_led_init(LED2); led1_thr = rt_thread_create( "led1", /*線程名字*/ thread_led1_entry,/*線程入口函數*/ RT_NULL,/*線程入口函數參數*/ 256, /*線程棧大小*/ 4 , /*線程優先級*/ 20); /*線程時間片*/ led2_thr = rt_thread_create( "led2", /*線程名字*/ thread_led2_entry,/*線程入口函數*/ RT_NULL,/*線程入口函數參數*/ 256, /*線程棧大小*/ 3 , /*線程優先級*/ 20); /*線程時間片*/ rt_thread_startup (led1_thr); rt_thread_startup (led2_thr); while(1) { rt_thread_mdelay(100); }} static void thread_led1_entry(void *parameter){ while (1) { gd_eval_led_toggle(LED1); rt_thread_mdelay(100); }} static void thread_led2_entry(void *parameter){ while (1) { gd_eval_led_toggle(LED2); rt_thread_mdelay(500); }}
編譯成功下載,發現程序并不運行,這是為什么呢?通過堆問題的查找,發現是main函數線程的堆棧空間分配的太小了,因為相比較于其他嵌入式系統,RT-Thread將main函數也做為了一個線程,我們在main函數中創建線程需要較大的空間,而RT-Thread給的默認配置的main線程的堆棧空間為256,修改為512即可:
再次編譯下載,成功,后期可以使用RT-Thread來開發多線程任務了。
七、演示
原文標題:GD32L233開發板評測 | RT-Thread操作系統移植
文章出處:【微信公眾號:GD32MCU】歡迎添加關注!文章轉載請注明出處。
-
芯片
+關注
關注
456文章
51004瀏覽量
425209 -
乘法器
+關注
關注
8文章
206瀏覽量
37129 -
RT-Thread
+關注
關注
31文章
1299瀏覽量
40258
原文標題:GD32L233開發板評測 | RT-Thread操作系統移植
文章出處:【微信號:GD32MCU,微信公眾號:GD32MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論