RTX5 | 配置文件RTX_Config.h(一)
文章目錄
- 一、前言
- 二、System Configuration(系統設置)
- 2.1、Global Dynamic memory size(內存池的大小)
- 2.2、Kernel Tick Frequency[Hz](內核滴答時鐘的頻率)
- 2.3、Round-Robin Thread switching(時間片輪轉調度)
- 2.4、ISR FIFO Queue(中斷回調請求FIFO隊列)
- 2.5、Object Memory usage counters(對象內存使用計數器)
一、前言
使用RTX5開發項目之前,一定要先把RTX5系統配置文件RTX_Config.h弄明白。在學習RTX5的配置文件后,我認為RTX5的系統配置文件比FreeRTOS與ucosIII的系統配置文件都要簡單。我在STM32F103與STM32H743都移植了RTX5,配置文件使用默認配置也能正常工作(FreeRTOS在移植后需要認真配置中斷相關的配置,不然會讓中斷回調函數卡死整個RTOS系統)。在RTX5上都變得簡單,System Configuration使用默認配置也能正常體驗RTX5系統。
FreeRTOS | STM32H7串口中斷調用FreeRTOS API,導致程序卡死
RTX_Congig.h包含以下內容:
二、System Configuration(系統設置)
以下摘自官方手冊:
The system configuration covers system-wide settings for the global memory pool, tick frequency, ISR event buffer and round-robin thread switching.
總的來說,System Configuration用于配置內存池,滴答定時器的頻率,中斷回調函數ISR的事件Buffer,時間片輪轉調度。
2.1、Global Dynamic memory size(內存池的大小)
內存池的大小默認值是32768個字節,相當于32K的RAM內存。每一款單片機都有RAM內存,只是大小或數量不一樣而已。以STM32F103為例子,在《STM32F10xx參考手冊》上查到STM32F103的系統架構。從系統架構看來STM32F103只有一個SRAM,這個SRAM的大小62K。當RTX5的內存池大小是默認的32K時,表示RTX5將占用STM32F103上RAM內存的一半以上。此外,也可以通過Keil查看當前工程分配RAM的大小。
STM32H743屬于Cortex-M7內核,擁有相當充裕的RAM內存。在STM32H743上運行RTX5系統,必須將內存池分配在128KB的DTCM(緊密耦合內存)上,因為CPU在DTCM內存讀寫數據的速度等于CPU的主頻(480M),其他的SRAM內存讀寫數據的速度僅僅只有200M(當然,配置Cache后的讀寫速度也能提升至480M,但是操作比較麻煩)。在Keil上很方便將默認內存設置為128KB的DTCM(如下圖所示),使用STM32CubeIDE的話,默認內存一開始就是128KB的DTCM了(就是不用管的意思)。
2.2、Kernel Tick Frequency[Hz](內核滴答時鐘的頻率)
摘自官方文檔:
Defines base time unit for delays and timeouts in Hz. Default: 1000Hz = 1ms period
總的來說,就是提供時間基準給osDelay( )與osDelayUntil( ),還有超時計算。Kernel Tick Frequency頻率越高就更占用CPU的資源,一般項目直接使用1000Hz即可。
2.3、Round-Robin Thread switching(時間片輪轉調度)
摘自官方文檔:
RTX5 may be configured to use round-robin multitasking thread switching. Round-robin allows quasi-parallel execution of several threads of the same priority. Threads are not really executed concurrently, but are scheduled where the available CPU time is divided into time slices and RTX5 assigns a time slice to each thread. Because the time slice is typically short (only a few milliseconds), it appears as though threads execute simultaneously.
總的來說,就是RTX5也提供時間片輪轉調度的功能。有了這個功能后,系統就允許有兩個以上的線程使用同一個優先級。為同一個優先級下的線程劃分時間片進行調度,時間片的長度可以通過Round-Robin Timeout設置(5等于5個Tick)。關于時間片輪轉調度的詳細資料可以查看《安富萊_STM32-V7開發板ThreadX內核教程(V0.6)》第13章,還有《嵌入式實時操作系統uC/OS-III》第7.3章節。
時間片輪轉調度適用于不要求任務實時響應的情況。我的實際項目都是工業控制機器人控制,對實時性都有要求。所以,一般我都會禁止時間片輪轉調度功能,取消勾選Round-Robin Thread switching這個選項。我的項目都是使用搶占式的方式進行調度(各個線程的優先級不一樣)。
2.4、ISR FIFO Queue(中斷回調請求FIFO隊列)
摘自官方文檔:
The RTX functions (Calls from Interrupt Service Routines), when called from and interrupt handler, store the request type and optional parameter to the ISR FIFO queue buffer to be processed later, after the interrupt handler exits.
The scheduler is activated immediately after the IRQ handler has finished its execution to process the requests stored to the FIFO queue buffer. The required size of this buffer depends on the number of functions that are called within the interrupt handler. An insufficient queue size will be caught by osRtxErrorNotify with error code osRtxErrorISRQueueOverflow.
總的來說,RTX5能緩存Cortex-M內核的中斷回調函數ISR的請求與參數。針對這個功能我是這樣測試的,在串口中斷回調函數里打了一個斷點,讓程序卡死在串口中斷回調函數里。接著,繼續通過串口助手往單片機發送字符,再一次觸發串口中斷回調函數。(相當于觸發了兩次串口中斷,但CPU卡在第一次串口中斷上,導致第二次串口中斷無法正常執行)。
2.5、Object Memory usage counters(對象內存使用計數器)
摘自官方文檔:
Object memory usage counters help to evaluate the maximum memory pool requirements for each object type, just like stack watermarking does for threads. The initial setup starts with a global memory pool for all object types. Consecutive runs of the application with object memory usage counters enabled, help to introduce object specific memory pools for each object type. Normally, this is required for applications that require a functional safety certification as global memory pools are not allowed in this case.
總得來說,就是在系統運行的過程中,計算線程,消息隊列等對象的生存情況。上面英文的最后一句話很重要,中文意思:對于需要安全性認真的應用程序來說,這個功能是必需的。勾選這個選項后,通過DEBUG模式下的RTX RTOS調試窗口可以看到Object Memory Usage Counter選項。當前的程序只創建了4個線程與3個消息隊列,在這個Counter上能看到。其中Start線程會在程序啟動后的5S時間將線程退出,所以Free等于1了。
總結
以上是生活随笔為你收集整理的RTX5 | 配置文件RTX_Config.h(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java学习之IDEA2020安装
- 下一篇: 不一样 使用别名 数据字段和bean_【