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