操作系統官方介紹: https://cloud.tencent.com/product/tos-tiny
騰訊TencentOS下載: https://github.com/Tencent/TencentOS-tiny
因為很早之前我試過華為lite os,因為lite os一些內存問題,試過之后就不想用了.
說說這個TencentOS,真是讓我耳目一新,熟悉的文件結構,文件命名.很有親切感呀.哈哈
沒錯!與我之前學習的CONTIKI NG相似度很高,一眼就愛上了。不過文件結構還是CONTIKI NG
比較緊密,比較精煉,比較老道。不過能理解,TencentOS則專注通用性,硬件驅動邦定不深入,
CONTIKI 強大之處在於無線NET網絡聯接,再者lwip協議棧的作者,就是CONTIKI作者,Adam Dunkels大神
對於CONTIKI在隔壁家 https://www.cnblogs.com/kinging/p/5882488.html 也有介紹:
芭啦芭啦這么多也放空話,話不多說,讓我們開始移植TencentOS吧!!
硬件平台:有一塊國產華芯微特的SWM32S開發板,之前玩LVGL用的,有RGB屏 有觸摸面板 有按鍵 有SD卡等等。
軟件平台:win10+IAR v9+TencentOS+J-LINK v9,我玩的話基本就是這一套環境
測試內容:進行2個不同優先級的串口printf打印任務,(如果順利的話,會在TencentOS上跑LVGL v8玩玩)
移植參考: https://github.com/Tencent/TencentOS-tiny/blob/master/doc/11.Porting_Manual_for_IAR.md
第一步:先移植OS,這個方法和官方的方法不一樣,華為和騰訊都是先找一個測試OK的裸機程序.
1_> 在 TencentOS-tiny\board\新建幾個文件夾,也可以從STM32復制過來,把里面的.h .c內容全部刪除掉
我建好的是這樣的,盡量保持相似,尊重一下原OS文件風格。。
2_> 在 TencentOS-tiny\board\SWM320_DISCOVERY\IAR里面,建一個工程和一個main.c源文件
所以你得學會手動創建IAR工程,而不是像STM32一樣有軟件生成工具,不會太復雜的.可能會慢一點,
但所有的信息都是可控的,知根知底.
這些空工程是多么簡單,說說為啥要用軟件生成?
按照理論上來說,在我們移植完OS后,在這個空工程下也應該是可以正常編譯成功的!!
3_> 先移植OS的四大文件,按官方的來,后續我們再把其它全移植進去。
這時的工作其實就是在IAR空工程內,建一些文件夾,加載它們的.h .c 文件,最后把工程路經設置好。。。。。正在進行中。。。。。
這是我們空工程的。。
這是TencentOS四大文件的。。。。
然后我們進行第1次IAR編譯,榮獲32個ERRORS報錯!!
原來是粗心大意,kernel部份沒有包含這些路經。
$PROJ_DIR$\..\..\..\kernel\core\include
$PROJ_DIR$\..\..\..\kernel\core
然后我們進行第2次IAR編譯,這次只有2個ERRORS報錯了
1個是打不開core_cm4.h文件 報錯,和1個是SystemCoreClock沒有定義,因為我們建的是空工程,所以才報錯的。
最后我們去華芯微特技術QQ 492524359群里,找到【SWM320_Lib-210524.rar】下載並解壓,
然后在OS操作系統TencentOS-tiny\platform\vendor_bsp下新建Synwit\SWM320文件,
把SWM320_Lib-210524\SWM320_Lib\SWM320_StdPeriph_Driver\CSL里的所有文件
復制到\platform\vendor_bsp\Synwit\SWM320里面.最后在我們的空工程加.h .c文件,加路經就OK了.
我們再進行第3次IAR編譯,這次時候就全部OK了
最后從board\NUCLEO_STM32F401RE\TOS_CONFIG下復制這個“tos_config.h”,粘貼到我們的SWM32對應里面board\SWM320_DISCOVERY\TOS-CONFIG,
將SWM320的tos_config.h改為:
還有一個粗心引起的報錯,打不開#include "SWM320.h",更新如下就行了。
$PROJ_DIR$\..\..\..\platform\vendor_bsp\Synwit\SWM320\CMSIS\DeviceSupport
$PROJ_DIR$\..\..\..\platform\vendor_bsp\Synwit\SWM320\CMSIS\DeviceSupport\startup\iar
$PROJ_DIR$\..\..\..\platform\vendor_bsp\Synwit\SWM320\SWM320_StdPeriph_Driver
$PROJ_DIR$\..\..\..\platform\vendor_bsp\Synwit\SWM320\CMSIS\CoreSupport
最終路經是這樣子的,終於OK了。
最后的最后,進行收尾工作,因為這個OS里面,main.h main.c mcu_init.h mcu_init.c是工程的標配文件,我們簡單先處理一下看看。
后面在按我們實際要求來編寫:
第二步:OS安裝systick心跳,這里我們只要實現mcu_init.c就行了,其他的完全不用更新
1 #include "mcu_init.h" 2 #include "tos_k.h" 3 #include "SWM320.h" 4 5 void board_init(void) 6 { 7 /* SWM320芯片系統的初始化 */ 8 SystemInit(); 9 } 10 11 /** 12 * @brief System Clock Configuration 13 * @retval None 14 */ 15 void SystemClock_Config(void) 16 { 17 /* 每10ms觸發一次中斷 */ 18 SysTick_Config(SystemCoreClock/10); 19 20 } 21 22 /* USER CODE BEGIN 4 */ 23 24 /* USER CODE END 4 */ 25 26 /** 27 * @brief This function is executed in case of error occurrence. 28 * @retval None 29 */ 30 void Error_Handler(void) 31 { 32 /* USER CODE BEGIN Error_Handler_Debug */ 33 /* User can add his own implementation to report the HAL error return state */ 34 35 /* USER CODE END Error_Handler_Debug */ 36 } 37 38 /** 39 * @brief This function is executed in case of SysTick occurrence. 40 * @retval None 41 */ 42 void SysTick_Handler(void) 43 { 44 /* OS的心跳 */ 45 if (tos_knl_is_running()) 46 { 47 tos_knl_irq_enter(); 48 tos_tick_handler(); 49 tos_knl_irq_leave(); 50 } 51 } 52 53 #ifdef USE_FULL_ASSERT 54 /** 55 * @brief Reports the name of the source file and the source line number 56 * where the assert_param error has occurred. 57 * @param file: pointer to the source file name 58 * @param line: assert_param error line source number 59 * @retval None 60 */ 61 void assert_failed(uint8_t *file, uint32_t line) 62 { 63 /* USER CODE BEGIN 6 */ 64 /* User can add his own implementation to report the file name and line number, 65 tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ 66 /* USER CODE END 6 */ 67 } 68 #endif /* USE_FULL_ASSERT */ 69 70 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
連上SWM32S開發板,在SYSTICK中斷處打上斷點,可以說算是成功了,因為時間關系!粗測了一下SWM320的官方芯片例程和TencentOS-tiny的DEMO,基本沒什么問題!!
文章的最后,給出2個任務的MIAN.C源碼,我已經測試OK了,沒毛病,已經移植成功了,多多加油 伙伴們!下次再見
這是main.c :
#include "cmsis_os.h" #include "mcu_init.h" #define APPLICATION_TASK_STK_SIZE 1024 extern void application_entry1(void *arg); osThreadDef(application_entry1, osPriorityNormal, 1, APPLICATION_TASK_STK_SIZE); __weak void application_entry1(void *arg) { while (1) { printf("This is a demo task1,please use your task entry!\r\n"); tos_task_delay(1000); } } extern void application_entry2(void *arg); osThreadDef(application_entry2, osPriorityNormal, 1, APPLICATION_TASK_STK_SIZE); __weak void application_entry2(void *arg) { while (1) { printf("This is a demo task2,please use your task entry!\r\n"); tos_task_delay(1000); } } int main(void) { board_init(); printf("Welcome to TencentOS tiny\r\n"); osKernelInitialize(); osThreadCreate(osThread(application_entry1), NULL); osThreadCreate(osThread(application_entry2), NULL); osKernelStart(); }
在線仿真:
時間2021-08-17:
在CMSIS_OS里面,有倆個版本源碼,官方盡然用舊版本的,有點想不明白 難道新版有問題嗎??
我試了一下,完全可以用新的V2版本,仿真完全正常( 簡單的基本測試v2是可以的,但是TX基本上是v1版的,所以我們要學只能學習舊的,國內技術應用太置后了 )
TencentOS-tiny\kernel\core下的標准搶占式內核的,例程是TencentOS-tiny\examples\hello_world
TencentOS-tiny\kernel\evtdrv下的純時間片內核的,例程是TencentOS-tiny\examples\event_driven_hello_world
通過 #define TOS_CFG_EVENT_DRIVEN_EN 1u 進行強制性開啟。