久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1405|回復: 9
打印 上一主題 下一主題
收起左側

兩個線程讀寫1個變量需要保護嗎?一個是中斷任務,一個是普通任務

[復制鏈接]
跳轉到指定樓層
樓主
ID:885416 發表于 2022-3-30 21:43 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
比如一個變量,有兩個線程讀寫,比如說一個是中斷任務,一個是普通任務,直接用volatile行嗎?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:883242 發表于 2022-3-30 23:13 | 只看該作者
這就是原子操作的概念。
以八位機為例,主循環:
int i;
i++;
對于8位機i是16位的,這個i++會分解成兩個操作:
i.low++;
i.high+=CY;
設i=255,那么實際操作就是:
i.low++; //i.low=0
i.high+=CY;  //i.high=1
這個代碼正常工作的話,i++的結果將是i=0x100也就是i=256,這個結果是正確的。

但是如果某個中斷程序也要讀取i的值,在i.low++之后發生了中斷,那么中斷讀到的i的值將是一個極其不合理的0!這會導致中斷處理程序發生異常操作!

所以,只要不是原子操作,主循環和中斷共享變量的話,一定要關閉中斷防止非原子操作被中斷打斷!上面代碼正確的寫法是:

IE=0; //關中斷
i++;
IE=1; //開中斷
回復

使用道具 舉報

板凳
ID:885416 發表于 2022-3-30 23:33 來自手機 | 只看該作者
Hephaestus 發表于 2022-3-30 23:13
這就是原子操作的概念。
以八位機為例,主循環:
int i;

大佬,如果是32位,不存在這個高低位情況下,單片機把一個變量加1,是先把變量從內存取出到寄存器,讓后把寄存器這個數加1,類似ADD R1 1這樣的指令,讓后放回內存里,是這個流程嗎?

如果先從內存取變量值為3到寄存器這個過程后,就發生了中斷,中斷里改變了內存里這個變量的值為5,然后中斷結束,任務恢復,讓后任務把寄存器里的3加1變成4,再放回內存,那么是不是這個變量的值就會發生錯誤?
回復

使用道具 舉報

地板
ID:883242 發表于 2022-3-31 00:37 | 只看該作者
azjdly 發表于 2022-3-30 23:33
大佬,如果是32位,不存在這個高低位情況下,單片機把一個變量加1,是先把變量從內存取出到寄存器,讓后 ...

單一的機器指令不會被打斷,所以不需要考慮原子操作問題。

主貼我忘了回答volatile問題,加不加volatile關鍵字跟原子操作沒任何關系。
回復

使用道具 舉報

5#
ID:123289 發表于 2022-3-31 08:50 | 只看該作者
只能依據你的需要判定。
回復

使用道具 舉報

6#
ID:415064 發表于 2022-3-31 09:05 | 只看該作者
讀的話不需要保護,寫是要保護的,volatile也沒用
回復

使用道具 舉報

7#
ID:401564 發表于 2022-3-31 15:55 | 只看該作者
贊同5樓的說法
要看你自己的需要去操作
一個普通任務,一個中斷,操作同一個變量,有可能出現的情況就是:你要普通任務中操作到一半的時候,中斷又去對這個變量進行操作,這就容易出現混亂
不管是8位機還是32位,都是一樣的,你都不知道你的代碼最后會被編譯成什么,就算是32位,你也不能保證你的代碼是一個時鐘就能完成的
所以,只能根據你自己的需要來操作
回復

使用道具 舉報

8#
ID:1012747 發表于 2022-3-31 16:04 | 只看該作者
中斷會導致掛起當前操作,從正常設計上來說你這個一般是需要去讀當前這個變量的,寫的話一般設計階段就得避免了,至于你描述的情況,除非你設計的時候就要做這樣的操作,否則就是設計上的bug。
這個應該按照樓上幾位大佬說的,根據你自己的需求從設計上進行操作。
然后是volatile的限定符的目的是警告編譯器不要進行假定的優化。主要是為了避免編譯器優化導致莫名其妙的問題的。
所以,最后就又回到你的需求上了。
回復

使用道具 舉報

9#
ID:883242 發表于 2022-4-1 17:26 | 只看該作者
Y_G_G 發表于 2022-3-31 15:55
贊同5樓的說法
要看你自己的需要去操作
一個普通任務,一個中斷,操作同一個變量,有可能出現的情況就是:你 ...

以我在沙發位的8位機例子為例,如果i是char型的,那么i++就是原子操作,無需保護,主循環可以隨便改,中斷也可以隨便讀。

什么是原子操作?原子操作只有2種狀態,一種是沒做,一種是做完了,看不到正在做的狀態。你連代碼會編譯成什么都不知道還是不要誤導他人了。
回復

使用道具 舉報

10#
ID:401564 發表于 2022-4-1 17:30 | 只看該作者
Hephaestus 發表于 2022-4-1 17:26
以我在沙發位的8位機例子為例,如果i是char型的,那么i++就是原子操作,無需保護,主循環可以隨便改,中 ...

對的對的,你說的是對的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 玖玖色在线视频 | 成人免费观看男女羞羞视频 | 欧美午夜精品久久久久久浪潮 | 亚洲一区在线免费观看 | 玖玖国产 | 激情综合五月 | 日本韩国电影免费观看 | 97视频在线观看网站 | 午夜影院免费体验区 | 中文字幕一区在线观看视频 | 久久久涩| 九九免费视频 | 天天干天天爱天天 | 久久高清国产 | 嫩草视频免费 | 先锋av资源在线 | 成人精品一区二区三区四区 | 日本精品一区二区三区视频 | 97综合在线| 欧美精品电影一区 | 欧美日韩在线免费 | 日本免费黄色一级片 | 国产精品免费一区二区三区四区 | 91中文字幕在线 | 国产精品99久久久久久人 | 欧美在线综合 | 久久成人精品 | 蜜桃av鲁一鲁一鲁一鲁 | 美女131mm久久爽爽免费 | 成人精品视频在线观看 | 99国产精品久久久 | 在线免费观看成人 | 国产精品久久久久久久久久了 | 久草在线| 韩国理论电影在线 | 黄色大片网 | 91影院 | 中文成人无字幕乱码精品 | 91伦理片 | 热99| 91福利在线观看视频 |