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

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进行参考

  1. 事件标志(OS::TEventFlag)。
  2. 互斥信号(OS::TMutex)。
  3. 任意类型的通道--数据队列(OS::channel)。
  4. 消息(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 ----

       

posted on 2021-12-06 01:17  木子剑  阅读(395)  评论(0编辑  收藏  举报