前言
??Linux與RTOS是校招八股的時候很喜歡考察的知識,在這里并沒有把兩個操作系統完全的獨立開去講,放在一起對比或許可能加深印象。我們講Linux的內核有五部分組成:進程調度、內存管理、文件系統、網絡接口、進程間通信,所以我也將從這五方面出發 + 中斷管理去對比和RTOS的不同。本篇只是一個開始的介紹。
- RTOS是什么?和前后臺程序的區別是什么?
- 前后臺程序: 前臺就是中斷 后臺就是while循環。 整個系統的結構簡單,但是對時間敏感的任務相應較差。比如在中斷響應結束后想要快速執行某項任務也得等while循環到
- 實時操作系統:是一種專門設計用于實時應用程序的操作系統。實時應用程序需要在特定的時間約束內對事件作出快速響應,因此RTOS旨在提供可靠、可預測的系統響應性能
- 實時操作系統的特點就是:確定性:(能在確定時間完成指定任務) / 可預測性 / 高可靠性
- 如何移植FreeRTOS?
- sysTickHandler PendSVHandler 與 SVCHandler 的移植
sysTickHandler : 任務調度 延時任務處理
PendSVHandler : 任務切換 堆棧的保存
SVCHandler : FreeRTOS中用來進入第一個任務 - 選擇一種內存管理算法
后面會細講 - FreeRTOSConfig.h的配置
使能什么調度原理
CPU的時鐘頻率
sysTickHandler調用的頻率
受FreeRTOS管理中斷的
- RTOS的啟動流程
-
4.1首先是裸機上電后的啟動流程
-
step1 給SP指針和PC指針賦值 PC指針指向Rest_Handler
??cortex-M3規定 起始地址必須存放堆頂指針 第二個地址是復位中斷向量入口地址,因為啟動的時候會從0x00000000取出值傳給SP指針 0x00000004的值賦給PC指針-
SP指針的值是怎么出現在bin文件開頭?
來自startup.s中這樣定義的段,這個段會在鏈接過程放在bin文件的開頭
-
ResetHandler是誰寫的
也在startup.s中
-
-
step2:執行Rest_Handler
- 2.1 執行SystemInit
初始化時鐘這個核心外設 - 2.2 執行__main函數
主要是用來初始化程序運行必要的堆/棧環境 把bin文件中的DATA段搬到內存,清空ZI段,最終跳轉main函數–這是直接用匯編寫的
- 2.1 執行SystemInit
-
-
4.2main函數創建開始任務 開啟任務調度函數vTaskStartScheduler();
-
4.3vTaskStartScheduler()做了什么事情?
- 創建空閑任務線程
- 創建定時器服務任務線程
- 設置PendSV 和 sysTick優先級為最低
- 初始化一些全局變量,設置調度器狀態為Ture
- 初始化時鐘節拍計數器、初始化臨界區嵌套計數器,如果ARM內核支持FPU,還會使能FPU
- 啟動第一個任務–通過使能SVC異常
- 通過SVCHandler跳轉第一個任務
- Linux的啟動流程
5會放在一個專門的篇章—啟動與升級篇去講 - 硬實時與軟實時的區別
硬實時嚴格限定在規定時間完成任務
軟實時允許出現一定的時間偏差,在隨著時間偏差的增大 整個系統的正確性就開始了下滑 - RTOS和Linux的區別?
關于這個問題 我希望后面把五個Linux內核子系統講清楚之后,就明了了