介紹
本應用筆記描述了使用 GCC 環境時,數據段的定位實現。
μC/OS-MPU介紹
μC/OS-MPU基于 μC/OS-II,增加了內存保護擴展,這種保護稱為“空間保護”,隔離 μC/OS-II 內核與任務。基于μC/OS-MPU,為任務提供了一個受保護的運行環境,其他任務不會干擾或損壞任務的內存,避免非法訪問。
· 空間保護
空間保護旨在保護應用程序的內存不被其他任務破壞。下圖展示了一個包含三個進程的系統,以說明空間保護的實現。
通常,μC/OS-II 內部變量和線程(任務)放到進程#0。進程#1包含 2個線程。進程#2包含 3個線程,線程可以訪問共享內存區域(shared memory)。進程#3是2個線程的集合,并且有權訪問共享內存區域。
段的組織
在基于μC/OS-MPU的應用中,進程中的所有全局數據位于同一個段。下圖展示了單個段的數據組織:
在啟動階段,運行環境的啟動函數將初始化數據(initialized data)從 ROM 復制到 RAM ,并清零未初始化數據(uninitialized data)。事實上,每個進程都有自己的段,在項目中,該組織結構可能存在多次。
· 未初始化數據
使用宏SP_MEM(
示例:全局變量 Task1Stk[] 和 SyncSem 放置到段”sec01”中未初始化數據域。
將已有代碼集成到μC/OS-MPU系統時,可以基于文件放置數據,僅需調整鏈接命令文件。
示例:基于提供的GCC鏈接命令文件模板,紅色部分的行表示將文件 myfile.c中未初始化數據放置到段”secA0”中的未初始化數據域。
在啟動階段,我們需要清零段中未初始化數據域。為了簡化實現,系統提供了一些有用的宏SP_INIT_
示例:在調用函數 MyInitData()時,段” sec01”和”secA0”中未初始化數據域清零。注意:函數”_zero_init”可能是啟動環境外部提供的:
· 初始化數據
使用SP_MEM(
示例:全局變量”MyNumber”和”MyValue”放到段” sec01”中的初始化數據域。此外,數據的值被放置在ROM中的數據區域。
將已有代碼集成到μC/OS-MPU系統時,也可以基于文件放置數據,僅需調整鏈接器命令文件。
示例:根據提供的GCC鏈接命令文件模板,紅色顯示的行表示將文件 myfile.c中的初始化數據放置到段” secA0”中的初始化數據域。
在啟動階段,我們需要復制段中的初始化數據域。為了簡化實現,系統提供一些有用的宏SP_INIT_
示例:調用函數 MyInitData()時,段” sec01”和” secA0”中的初始化數據域,將從 ROM 復制到 RAM。
注意:函數"_data_init"可能不是啟動環境提供的:
審核編輯 :李倩
-
操作系統
+關注
關注
37文章
6825瀏覽量
123331 -
GCC
+關注
關注
0文章
107瀏覽量
24844 -
線程
+關注
關注
0文章
504瀏覽量
19683
原文標題:空間隔離操作系統μC/OS-MPU中段的定位
文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論