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