騰訊開源精簡操作系統TencentOS-tiny與SWM320初試


 

作系統官方介紹: 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  進行強制性開啟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM