scmRTOS移植SWM32S入门教程


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 ----


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM