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 道客巴巴
时间:2024年04月12日
因为工作原因,要做一个小的控制板,决定使用IAR+scmROTS进行开发,芯片采用最通用的STM32F103C8T6,于是看了以前的测试例程和ROTS手册,现总结归纳一次:
----01_>scmROTS为嵌入C++编写,是C++的子集。可以使用在极小RAM单片芯片中,如STM8S系列,至少在512字节RAM以上芯片资源。
----02_>scmROTS为嵌入C++编写,只要了解C++的基本语法、对像创建及使用规则、模块使用。C或C++完全通用,熟悉C++的是C++编程风格,熟悉C的是C编程风格。
----03_>scmROTS为静态的进程,在编译时就确让了所有功能属性,不可以在程序运行中,进行动态增加或删除进程,这种功能开销比较大,不适合小型RAM的单片机
----04_>scmROTS的作者母语为俄语,试图编写他国文档。开发初期是使用 IAR Systems环境对MSP430进行开发,现版本已升级到V5.2了,但建意使用V4.0完整、稳定版本。(时间验证)
----05_>scmROTS完全接管如:任务调度、进程堆栈、中断堆栈等。完全独立,互不影响。
----06_>scmROTS进程的优先级范围pr0-pr30,在用户使用中pr0表示最高。注意优先级不能相同,不存在同优级以时间片执行思想。
----07_>scmROTS支持用户无限扩展功能,并且ROTS内核不用进行任何更改,例程代码中的进程分析器就是一个扩展案例,其他功能扩展都是一模一样。
----08_>scmROTS支持通讯机制:都配置了完整的DEMO进行参考
- 事件标志(OS::TEventFlag)。
- 互斥信号(OS::TMutex)。
- 任意类型的通道--数据队列(OS::channel)。
- 消息(OS::message)。
上面说: TCHannel过时的,仅仅是因为它不够灵活,
----09_>scmROTS三大文件机制,通用内核、目标芯片和工程项目
比如:在Project部份中的scmRTOS_TARGET_CFG_H头文件中,可配置单片机的主频和SYSTICK
----10_>在IAR使用中,除目标芯片要选对,最好使用项目本地ICF文件,配置ROM RAM和堆栈等等,启动文件也使用OS适配好的port文件内的,如果有重名或重复时,保留OS部份的。
----11_>现有一事不明白,在TEventFlag的例程中,在普通任务中TEventFlag.wait()等事件,但在OS::system_timer_user_hook()的函数中执行了TEventFlag.signal_isr();
这应该是发送事件吧,从类的成员函数来看,如下图:
TEventFlag.signal_isr()应该是用于中断级别成员函数,而TEventFlag.signal()用于程序级别的成员函数。
----12_>在测试中,EventFlag事件是广播方式的,测试现像为当一个进程发事件时,其他所有的等待该事件的进程,都可以得到执行。
时间:2024年04月18日
现在些现像很神奇,我开了5个任务测试,0号任务已经写完了,如下图:
找了一个下午,出现异常的如下图:
这C++的服气了,早知道用TNeo操作系统了;哪个C写的,之前用过了,不会存在这些问题.,这次只是想试试做个东东来用。
经过试验,找到逃避这OS的BUG了,V5.2没试过,不知道是不是优化好了这个问题,或者是我忽略什么地方引起的,处理如下:
倒数1 倒数2的进程让它空转,不要使 用就可以了,哈哈,有点搞笑吧?
时间:2024年05月14日
应该找到原因了,scmRTOS_CONFIG_H申明任务数量,要与实际定义任务要一致; 不能说你申明了5个任务,实际定义了3个任务;是不适当的!!
还有就是,写的中断函数,按要求在前面加入OS_INTERRUPT进行修饰,让scmRTOS知道是中断级的,不是程序级的。
我已经把scmRTOS v5.2版本,成功移植到了SEGGER Embedded Studio v8.10d了,
时间:2024年05月18日
该OS的任务的申明和定义,最好像例程一样,都放在MAIN.CPP内,放在其他.H头文件时,可会出现硬件错误; 这个V5.2版本,在SES v8.10d环境中,Compiler选GCC,C版本选C17,C++版本选C++17。我做了个极端测试,优化等极开到最高,空间由6.2KB压小到4.8KB,6个任务1MS最小时间打印信息测试,全部正常OK。
应该基本稳定了。Compiler选SEGGER时,优化一开后,直接硬件错误,而GCC完全OK!!!
---- END ----