Azure RTOS。第1部分:概述和启动(STM32 + CubeIDE + HAL)

在最近的Microsoft Build 2020中,Azure RTOS被反复提及为专用于微控制器的硬实时操作系统。



在本材料中,我们将始终确定它是哪种操作系统,在嵌入式系统的Microsoft产品中占据什么位置,并且还将OS调度程序安装在STM32微控制器之一上。



对于那些对复审不感兴趣但需要实际操作的人,请直接进行。



这到底是什么?



微控制器是一种专用的微电路,在一个封装中将微处理器,存储器和外围设备结合在一起。与``大型''计算机不同,它的内存非常有限:RAM和ROM的典型值都是几十到几百个千字节。



通常,微控制器没有MMU(尽管有例外,但是这些正是可以更正确地归因于完全不同的片上系统类别例外),也就是说,没有对虚拟内存机制的硬件支持,这不允许使用“全功能”即使使用外部微电路扩展内置存储器,也可以使用OS。



, , IDE, . , , .. , , . , , , = = , , , (""). . , ThreadX, , — .



, . , , 128 ROM 64 RAM – . , "" , USB , , , "" .



, ""? - . . , , , . , "" .



, . , MMU ucLinux – "" Linux MMU ( , , ). , , ucLinux.



Microsoft?



Microsoft "" , Windows 10 IoT Enterprise LTSC, . Windows 10 IoT Enterprise ( ) . , Windows 10 IoT Core, UWP, : Raspberry Pi 2.



Windows Embedded Compact, , - . Compact – , "" Windows, . 2013- , , , .



Microsoft , , . , , .



.Net Micro Framework, C#. , – . , "Archive", 2018- . .Net Micro Framework C#, , . C# "" , — ( ). .Net Micro Framework.



C#: https://www.nanoframework.net/, https://www.wildernesslabs.co/. , ucLinux, , : , .



2019 Microsoft Express Logic, Microsoft Azure RTOS, X-WARE IoT Platform. Azure RTOS ThreadX , Azure IoT Hub Azure IoT Central. Azure RTOS Azure .



Azure RTOS :



  • ThreadX, , , , ;
  • TCP/IP NetX/NetX Duo;
  • FAT FileX;
  • USB Host/Device/OTG USBX;
  • GUI: GUIX (GUIX Studio);
  • - FileX: LevelX;
  • TraceX;
  • SDK Azure IoT NetX Duo – Azure.


: Azure Sphere. — . ( SoC) Linux, .





, , , .



, . , , - .



. – .



:



  • Windows Embedded Compact — ;
  • Azure RTOS/ThreadX — ;
  • Azure Sphere — , (Azure Sphere OS) , .


, , , , .



, , , . "" , , , .. .



, , , , : , .



ThreadX ? ThreadX : . , 100 .



, Azure RTOS — Microsoft. , ( ) Azure Sphere, , .



Azure RTOS



, ( 6 ). , , , , , , , .



Azure RTOS, , . , , ?



  • . 2 ROM. .
  • , , .
  • ( 100 ), ( 120 ), , "".
  • IDE .
  • (Preemption threshold) — N , N, .. 0 (N — 1) , N (.. N ) . , . .
  • (Event chaining) — , , (, ).
  • (Priority inheritance) — . — , .
  • ;
  • (Modules). ThreadX "" "", . " " . , .
  • . . , .. — . , .. , .


ThreadX FreeRTOS , , .





Azure RTOS — . .



  • , , , , , , ;
  • . 2020 , , issue, Microchip, NXP, Renesas, ST, Qualcomm;
  • .


.



ThreadX STM32



Azure RTOS :





, ThreadX . ThreadX , , . , , , , , ( - C++, ).



ThreadX, , . , " " - , , .



STM32F4Discovery, , , STM32F103C8T6.



STM32F4Discovery , ST-Link, , (STM32F407VGT6) .





,



Windows 10 ( , 7).



STM32 HAL — API STM32. "", "" HAL. , HAL, "", . HAL , .



STM32CubeIDE — IDE STMicroelectronics .



ThreadX c GitHub. , , "" , : "Clone", "Download zip". UPD (. ): , , . , , Git , , , :



git clone https://github.com/azure-rtos/threadx.git
git checkout f8e91d4


threadx threadx-master.



STM32F4Discovery Mini-USB , "ST Link" . .







STM32CubeIDE. Workspace — .



, Start New STM32 Project.





1 STM32F4DISCOVERY, 2 ( ) Next (3):





, . threadx_test, , , .





"Copy only necessary files..." Finish.





Yes:







Project Explorer, . threadx_test.ioc ( ):





Clock Configuration , :





, SYSCLK = 168 , SysTick.



Pinout & Configuration, Connectivity, USB_OTG_FS (1) (2), (3) Reset_State (4).





USB OTG, HAL_Delay, , , . ThreadX, HAL ThreadX, . , USB OTG.



System Core SYS TIM7 Timebase Source Serial Wire Debug:





SysTick Timer ThreadX.



PA0, . User Manual , :





, . , . System Core — GPIO:





System Core — NVIC EXTI0:





Priority group "4 bits...":





! EXTI line0 interrupt Preemption priority 15 ( ). , , RTOS, , RTOS. .



, . , ThreadX , .



, Code Generation, Pendable request for system serivice, System tick timer, ThreadX Cortex-M4, :





.



threadx-master threadx_test\Middlewares workspace. Project Explorer F5 , :





threadx_test Properties. C/C++ General — Paths and Symbols. Add



Middlewares/threadx-master/ports/cortex_m4/gnu/inc


, :





, , ( cortex_m0, 3, 4, 7)





Middlewares/threadx-master/common/inc


! Source Location , Source folders on build path :



  • /threadx_test/Core
  • /threadx_test/Drivers
  • /threadx_test/Middlewares


- — .



Apply and Close .



Middlewares/threadx-master/ports Project Explorer :



  • cortex_m0
  • cortex_m3
  • cortex_m7
  • cortex_m4/gnu/src/tx_vector_table_sample.S ( )


/ , Properties Exclude resource from build:





-.



( ):



  • Middlewares/threadx-master/cmake
  • Middlewares/threadx-master/docs
  • Middlewares/threadx-master/samples


, :



  • Middlewares/threadx-master/common
  • Middlewares/threadx-master/ports/cortex_m4


STM32F407VGTX_FLASH.ld



  ._user_heap_stack :
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(8);
  } >RAM


(, )



    . = ALIGN(8);




    __RAM_segment_used_end__ = .;


ThreadX . .



RAM, STM32F407VGTX_RAM.ld.



Project Explorer Middlewares/threadx-master/ports/cortex_m4/gnu/src tx_initialize_low_level_sample.S.





SYSTEM_CLOCK      =   6000000


6000000 168000000 SYSCLK.





SYSTICK_CYCLES    =   ((SYSTEM_CLOCK / 100) -1)


100 1000. 100 1000 : ThreadX, .



.



Core/Src/main.c



/* USER CODE BEGIN Includes */
#include "tx_api.h"
/* USER CODE END Includes */




  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */




  tx_kernel_enter();


.



Core/Startup/startup_stm32f407vgtx.s





.global  Default_Handler




.global _vectors




g_pfnVectors:




_vectors:


ThreadX.



Core/Src/ demo_threadx.c .



#include "tx_api.h"
#include "main.h"

/*    -   */
#define DEMO_STACK_SIZE         1024

/*   ,       -,   */
#define DEMO_BYTE_POOL_SIZE     10240

/*  - */
#define THREAD_COUNT 4

/*  ,        (thread control block) */
TX_THREAD               thread_x[THREAD_COUNT];

/* ,      */
TX_BYTE_POOL            byte_pool_0;

/*    */
TX_EVENT_FLAGS_GROUP    evt_group;

/*     TX_BYTE_POOL */
UCHAR                   memory_area[DEMO_BYTE_POOL_SIZE];

/*   ()   N */
#define EVT_KEYPRESS_THREAD(n) (1 << n)

/*       */
#define LED_PAUSE_AND_DEBOUNCE_TIME_MS 100

/*      */
static struct
{
    GPIO_TypeDef* GPIOx;
    uint16_t GPIO_Pin;
    uint32_t blink_delay_ms;
    char thread_name[10];
} BoardLedsSettings[THREAD_COUNT] =
{
    { LD3_GPIO_Port, LD3_Pin, 250,  "orange" },
    { LD4_GPIO_Port, LD4_Pin, 500,  "green" },
    { LD5_GPIO_Port, LD5_Pin, 750,  "red" },
    { LD6_GPIO_Port, LD6_Pin, 1000, "blue" }
};

/* Callback   () */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_0)
    {
        for (int i = 0; i < THREAD_COUNT; i++) tx_event_flags_set(&evt_group, EVT_KEYPRESS_THREAD(i), TX_OR);
    }
}

/* -worker   4  */
void thread_entry(ULONG thread_input)
{
    /*       */
    uint8_t led_state = GPIO_PIN_RESET;
    uint32_t cur_delay_ms = BoardLedsSettings[thread_input].blink_delay_ms;
    ULONG actual_flags_ptr;
    while(1)
    {
        HAL_GPIO_WritePin(BoardLedsSettings[thread_input].GPIOx, BoardLedsSettings[thread_input].GPIO_Pin, led_state);
        led_state = !led_state;
        if (TX_SUCCESS == tx_event_flags_get(&evt_group, EVT_KEYPRESS_THREAD(thread_input),
            TX_AND_CLEAR, &actual_flags_ptr, cur_delay_ms))
        {
            /*    " ".   */
            HAL_GPIO_WritePin(BoardLedsSettings[thread_input].GPIOx, BoardLedsSettings[thread_input].GPIO_Pin, GPIO_PIN_RESET);
            /* ,   ,    */
            tx_thread_sleep(LED_PAUSE_AND_DEBOUNCE_TIME_MS);
            /*    ,  ,         () */
            tx_event_flags_get(&evt_group, EVT_KEYPRESS_THREAD(thread_input), TX_AND_CLEAR, &actual_flags_ptr, TX_NO_WAIT);
            /*        */
            led_state = GPIO_PIN_SET;
            /*   */
            cur_delay_ms = (cur_delay_ms == BoardLedsSettings[thread_input].blink_delay_ms) ?
                cur_delay_ms * 2 : BoardLedsSettings[thread_input].blink_delay_ms;
        }
    }
}

/*   */
void tx_application_define(void *first_unused_memory)
{
    CHAR    *pointer = TX_NULL;

    /*  byte memory pool,          */
    tx_byte_pool_create(&byte_pool_0, "byte pool", memory_area, DEMO_BYTE_POOL_SIZE);

    /*    */
    tx_event_flags_create(&evt_group, "event group");

    /*    4 ,            BoardLedsSettings */
    for (int i = 0; i < THREAD_COUNT; i++)
    {
        /*     i */
        tx_byte_allocate(&byte_pool_0, (void **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
        /*   i */
        tx_thread_create(&thread_x[i], BoardLedsSettings[i].thread_name, thread_entry, i, pointer, DEMO_STACK_SIZE,
            1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
    }
}


4 , , , . . — . .



Project — Build All , .



Run — Debug Configurations, STM32 Cortex-M C/C++ New Configuration:





( ST-LINK ) Debug. .





  HAL_Init();


F8, , . .





— " " RTOS. 4 , — , . RTOS (UPD: . ).



, RTOS. ( -callback HAL_GPIO_EXTI_Callback() ), . .



, , , . . , ( , ), . — .



(thread_entry), "" , (, , , ) BoardLedsSettings. : , , .



RTOS . , . , , . , , , . 1 .



tx_thread_create() . , , . , , ThreadX . (byte_pool_0),



tx_byte_pool_create(&byte_pool_0, "byte pool", memory_area, DEMO_BYTE_POOL_SIZE);




tx_byte_allocate(&byte_pool_0, (void **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);


(pointer) :



tx_thread_create(&thread_x[i], BoardLedsSettings[i].thread_name, thread_entry, i, pointer, DEMO_STACK_SIZE,
    1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);


:



  • , , , . . ThreadX , .
  • ( TX_AUTO_START).
  • TX_NO_TIME_SLICE time-slice . , , .
  • , .
  • ThreadX . . .


tx_application_define(), . , .





Azure RTOS () , FileX, NetX .. — .



, ThreadX , . Microsoft , Azure RTOS Microsoft — .



— , . sergant (at) quarta.ru.




All Articles