嵌入式軟件開發(fā)的基礎(chǔ)知識(5)結(jié)構(gòu)體問題
????在開發(fā)過程中,經(jīng)常會需要很多的標志位。標志位的狀態(tài)大多數(shù)都僅僅占用一兩個bit。所以為了節(jié)省內(nèi)存占用,方便管理標志位,使用結(jié)構(gòu)體和聯(lián)合體的方式。
????如下所示定義結(jié)構(gòu)體,聯(lián)合體,以及初始化聯(lián)合體。其中定義部分可以放到 .h 文件中。初始化可以放到 .c 文件中。并且該變量可以在 .h 文件中 extern 出去,在外部使用。
注意事項:
????因為我是做伺服研發(fā)的,所以程序需要內(nèi)外環(huán)不同時序調(diào)度。
????主循環(huán)1K調(diào)度 (1ms調(diào)度一次)
????位置環(huán)4K調(diào)度 (250us中斷調(diào)度一次)
????速度環(huán)和電流環(huán)16K調(diào)度(62.5us中斷調(diào)度一次,中斷優(yōu)先級最高)
????因為16K和4K的程序都是中斷函數(shù)。所以16K可以打斷4K和1K調(diào)度的程序。4K也可以打斷1K的主循環(huán)。
????如果存在不同環(huán)路對同一個Union操作,則位域賦值操作過程中可能會被中斷打斷,造成數(shù)據(jù)丟失。例如1K對Union的任意bit賦值時,被16K程序打斷,且在16K程序中執(zhí)行了對Union任意bit的寫操作。在16K程序執(zhí)行完成后,1K程序從堆?;謴同F(xiàn)場,就會導致16K中的賦值操作無效。
????如果有學過多線程,應(yīng)該很熟悉這個問題。但是很遺憾,裸機開發(fā)沒有鎖和臨界區(qū)這種東西。所以不同時序?qū)ν粋€數(shù)據(jù)進行寫操作一定存在風險。要避免不同調(diào)度中對一個變量進行賦值。如果某個Union不同調(diào)度中有寫操作,那就老老實實的用Uint8變量來表示標志。 如果是變量存在不同調(diào)度的寫入操作,那這就沒辦法了。(Union的所有的bit賦值都存在風險。但是使用的Uint8數(shù)據(jù)只會和自己沖突。)
????
? ??