木子剑
生命不熄,学习不止!

 

作系统官方介绍: 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  进行强制性开启。

posted on 2021-08-16 00:09  木子剑  阅读(916)  评论(0编辑  收藏  举报