scmRTOS下载地址: https://github.com/scmrtos/scmrtos/releases
当前版本为:scmrtos-release-v5.2.0,但我建议使用scmrtos-release-v4.0版本。
以下都是经过测试ok的源码,为了方便移植到SWM32S或其他芯片,特此一次随记。先思考一些问题
开发板的SWM32S虽然是M4,但它没有FPU,DSP单元,所以完全可以当成加强版的M3来使用,好了。
scmRTOS配有STM32F103的例程,并且也玩得差不多了。于是乎就有了这些骚作。
最简化,OS的配置文件scmRTOS_config.h
/* OS适配文件: OS配置头文件 */ #ifndef scmRTOS_CONFIG_H #define scmRTOS_CONFIG_H #ifndef __IAR_SYSTEMS_ASM__ typedef uint16_t timeout_t; typedef uint_fast32_t tick_count_t; #endif // __IAR_SYSTEMS_ASM__ #include <stdint.h>
#define scmRTOS_PROCESS_COUNT 1
#define scmRTOS_USER_DEFINED_CRITSECT_ENABLE 0
#define scmRTOS_SYSTIMER_NEST_INTS_ENABLE 1
#define scmRTOS_SYSTEM_TICKS_ENABLE 1
#define scmRTOS_SYSTIMER_HOOK_ENABLE 0
#define scmRTOS_IDLE_HOOK_ENABLE 0
#define scmRTOS_IDLE_PROCESS_STACK_SIZE 128
#define scmRTOS_PRIORITY_ORDER 1 #define scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE 0
#define scmRTOS_DEBUG_ENABLE 0 #define scmRTOS_PROCESS_RESTART_ENABLE 0 #endif // scmRTOS_CONFIG_H
最简化,OS的main.cpp,为了加快移植进度,尽可能不加载没使用的分支文件。
//------------------------------------------------------------------------------ #include <scmRTOS.h> #include "SWM320.h" //------------------------------------------------------------------------------ typedef OS::process<OS::pr0, 100> TProc1; // Process types TProc1 Proc1; // Process objects tick_count_t T; // global variable for OS::GetTickCount testing //------------------------------------------------------------------------------ void main() { SystemInit(); // 系统初始化为192MHZ OS::run(); } //------------------------------------------------------------------------------ template<> OS_PROCESS void TProc1::exec() { /* 一个测试 IO口 */ GPIO_Init(GPIOB, PIN12, 1, 0, 0); //背光控制 while(1) { sleep(1); // 周期1ms,测量OS的心跳时钟 GPIO_InvBit(GPIOB, PIN12); T++; // 测试变量值 } }
要移植到任意其他芯片时,我们只要实现3大文件,
第1个是:
这文件中,是基于M3内核实现文件,_asm.s是系统启动OS时,
第一个执行的文件,OS主要接管芯片并维护如下元素:
os_context_switch_hook;
os_start ;
PendSV_Handler;
init_system_timer;
第2个是:
swm32s_iar.icf,因为我是用的IAR。参考stm32f334r8.icf ,对芯片的内存和堆栈进行设置。
第3个是:
swm32s_iar_startup.cpp,这个主要维护一些中断向量表,其中0-15号中断是ARM内核通用的,与
samples\cortex\mx-iar\1-event-flag-m4f-nucleo-f334r8\src下的startup一样,如图所示0-15号:

这是C++的文件, 其他的外设中断号,要与芯片对号入座就好。
最后为了兼容C++,华芯SWM32固件库的所有.H头文件,都要加上如下内容:

最后的最后main,cpp

无法想像,OS操作系统用C++,是如些的简单,一个swm32s_startup_iar.cpp就直接干掉了,这三个C文件:
其实我能想像,是用C++的模板和虚函数实现的!!
烧进Swm32s开发板,引脚上测试波形:

上一张全家福:

一些文献:
https://vimsky.com/examples/detail/cpp-ex-os-TEventFlag---class.html 代码天空
https://m.doc88.com/p-6854560370813.html?r=1 道客巴巴
---- END ----
