mbed OS 5.0 版本後,是否預設就是 RTOS (ARM RTX) ?

26 Oct 2017

以下為官方標準範例,預設 main()就是第一個thread...

mbed-os-example-blinky

#include "mbed.h"
 
DigitalOut led1(LED1);
 
// main() runs in its own thread in the OS
int main() {
    while (true) {
        led1 = !led1;
        wait(0.5);
    }
}

以下為Nuvoton的範例程式...

NuMaker-mbed-OS-Core-RTOS-Basic

#include "mbed.h"
#include "rtos.h"
 
DigitalOut led1(LED1);
DigitalOut led2(LED2);
 
void led2_thread(void const *args) {
    while (true) {
        led2 = !led2;
        Thread::wait(1000);
    }
}
 
int main() {
    Thread thread(led2_thread);
    
    while (true) {
        led1 = !led1;
        Thread::wait(500);
    }
}

這樣我有些疑問 ?

1. 使用 RTOS (ARM RTX) 是否不再需要 include "rtos.h" ?

2. 一般使用 wait() 是否就等同於 Thread::wait() ?

3. 使用 "PlatformMutex.h" 的 mutex 是否就等同於 RTOS (ARM RTX) 的mutex ?

26 Oct 2017

剛trace了mbed os 5.6版的程式,來自問自答一下,有誤的話請糾正....

1. RTOS 預設是打開的 (參考 \mbed-os\rtos\mbed_lib.json -> \BUILD\xxx\xxx\mbed_config.h -> MBED_CONF_RTOS_PRESENT )。在\mbed-os\mbed.h 裡,會根據 MBED_CONF_XXX_PRESENT來判斷是否引用相關header檔,結論就是用RTOS不需要include "rtos.h"

2. Thread::wait() 是 RTOS function;wait() 則根據 MBED_CONF_RTOS_PRESENT來判定是否為 RTOS function (參考 \mbed-os\platform\mbed_wait_api_no_rtos.c 及 mbed_wait_api_rtos.cpp)

3. 兩個mutex 是相同的,但如果 MBED_CONF_RTOS_PRESENT 為0,PlatformMutex 則會是空的Stub function (參考 \mbed-os\platform\PlatformMutex.h)

有一個地方比較奇怪,新版文件將EventQueue歸類在RTOS底下,雖說RTOS可以使用EventQueue,但EventQueue又可以單獨使用,兩個東西應該是個別獨立的東西, https://os.mbed.com/docs/v5.6/reference/event.html

30 Oct 2017

@Ozzy Chiu

答案回答的很快! 是的,在Mbed OS 5, 所有的東西都是在RTOS上。Timer和EventQueue也不例外,很多這類的class是為了對前版本OS程式提供支援,也讓使用者方便。

Neil