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