關於 Arduino Ameba 的 100 篇 - RTOS - 1 (5/100)
剛在 Ameba 的實驗版上, 做了一個給 RTOS 的通道.
( 如何安裝實驗版 - 可以參考 這篇 Windows 安裝 )
如 之前 main function 介紹, Arduino 本身是沒有 RTOS 的.
但在有網路 / wifi stack / TCPIP stack 的作業環境下, 完全沒有 OS 是不容易支援的.
因此這篇介紹一下怎麼裝上 RTOS, 我們以 ARM mbed 的 RTX 為例.
( FreeRTOS 也是類似做法 : RTK 官網 Arduino SDK 裡搭配的是 FreeRTOS.
有關 FreeRTOS, 網路上有很多資訊, 如 成大 wiki FreeRTOS )
ARM mbed 的 RTX
在 ARM mbed 2.0, 有一套 RTX ,
https://developer.mbed.org/handbook/CMSIS-RTOS
有關 RTX, 可以參考 ARM 這篇介紹
在 ARM 買下 Keil 之前, 這是一套商業軟體.
ARM 買下後推行 mbed OS, 把這套改成了 免稅版 (royalty-free )
目前, 我把整個相關程式做成 library, 安裝後, 會在
windows 會放在 :
C:/Users/<使用者名稱>/AppData/Local/Arduino15/packages/njiot/hardware/ameba/<版號>/system/libos
MAC OS 將來會放在 : (目前還沒改 JSON for MAC)
/Users/<使用者名稱>/Library/Arduino15/packages/njiot/hardware/ameba/<版號>/system/libos
在這底下有個 build_gcc/ , 底下有 Makefile, make 後, 會產生 librtos.a 在 variants/arduino_ameba/ 下
如何掛入 RTOS
我把相關程式搬到 variant.cpp
如前一篇 main function 介紹 的向量表方式
我們可以把 _AppStart() 當作是在 Reset Handler function (重置的向量表函式) 最後呼叫,
一般在 Arduino 如前介紹是直接呼叫到 main(), 這邊我們
(1) 先置換三個 中斷向量函式 為 RTOS 提供的函式,
(2) 有一段 inline assembly 寫法,
先呼叫 RTOS 的 SystemInit(),
然後呼叫 toolchain libc 內的 function _start(),
_start() 會再一路呼叫到 main()
如下.
extern void SVC_Handler (void);
extern void PendSV_Handler (void);
extern void SysTick_Handler (void);
static inline void VectorTableSettingForOS(
void *PortSVC,
void *PortPendSVH,
void *PortSysTick
)
{
//4 Initial SVC
NewVectorTable[11] =
(HAL_VECTOR_FUN)PortSVC;
//4 Initial Pend SVC
NewVectorTable[14] =
(HAL_VECTOR_FUN)PortPendSVH;
//4 Initial System Tick fun
NewVectorTable[15] =
(HAL_VECTOR_FUN)PortSysTick;
}
// The Main App entry point
void _AppStart(void)
{
VectorTableSettingForOS((void*)SVC_Handler,
(void*)PendSV_Handler,
(void*)SysTick_Handler);
__asm (
"ldr r0, =SystemInit\n"
"blx r0\n"
"ldr r0, =_start\n"
"bx r0\n"
);
}
留言
張貼留言