2016-03-29 109 views
0

我用C寫一個程序PIC32的uC與多箇中斷服務程序的全局變量,有一個全局變量(uint32_t的類型),可以讀/從多箇中斷服務程序,並從主修改。
我知道這是不安全的,所以我想知道如何使它安全?有沒有一個例子說明如何使它安全?共享使用C

編輯1:

中斷可以互相中斷嗎?是
ISR是否更新變量?是 主要更新變量嗎?是 是寫入和讀取的變量原子,你怎麼知道?不確定
是否存在RTOS?沒有

+0

最安全的方法是:不這樣做!順便說一句,我希望你把var定義爲volatile。 – LPs

+0

好吧,這聽起來像你在使用獨立環境,所以C沒有強制許可,但是如果你想編寫可移植代碼,你可以看看C11標準草案n1570:* 5.1.2.3程序執行5當抽象機器的處理由於接收到一個信號而中斷,既沒有鎖定自由原子對象,也沒有指定類型易失性sig_atomic_t的對象的值沒有被指定[...]。任何對象的該處理程序修改的值既不是無鎖原子對象也不類型的當處理程序退出[...] * – EOF

+1

如果您設置揮發性sig_atomic_t變得不確定,使得中斷被禁止時你」重新服務中斷,那麼你所需要做的就是在你讀取或修改main中全局的任何地方禁用中斷。 – Ross

回答

1

如果你真的需要保留可以在多箇中斷的服務,可以互相中斷期間進行修改全局變量,我建議你下面的方法做:

  1. 使操作的所有序列(讀和/或寫入)這些變量「原子」之前通過禁用所有中斷,然後重新啓用所有中斷。在PIC32上,可以通過寫入全局中斷標誌GIE來完成此操作。
  2. 聲明這些變量作爲揮發性避免編譯任何意外的優化。
  3. 重命名這些變量與特定的前綴清楚地辨別出來,如Shared_XXXX,但它取決於你所使用的命名約定。
  4. 把對這些變量操作的所有序列與特定的前綴命名清楚地識別它們的功能,如Atomic_XXXX()。要實現第1點:要麼這些函數必須全部通過禁用所有中斷開始,並通過重新啓用所有中斷來結束,或者可以將原子函數作爲回調參數系統地傳遞到禁用所有中斷的函數,調用回調函數並重新啓用所有中斷打斷。
+0

我喜歡你的建議,謝謝 –