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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1493|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

兩個(gè)線程讀寫1個(gè)變量需要保護(hù)嗎?一個(gè)是中斷任務(wù),一個(gè)是普通任務(wù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:885416 發(fā)表于 2022-3-30 21:43 來(lái)自觸屏版 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
比如一個(gè)變量,有兩個(gè)線程讀寫,比如說(shuō)一個(gè)是中斷任務(wù),一個(gè)是普通任務(wù),直接用volatile行嗎?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

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

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

IE=0; //關(guān)中斷
i++;
IE=1; //開(kāi)中斷
回復(fù)

使用道具 舉報(bào)

板凳
ID:885416 發(fā)表于 2022-3-30 23:33 來(lái)自觸屏版 | 只看該作者
Hephaestus 發(fā)表于 2022-3-30 23:13
這就是原子操作的概念。
以八位機(jī)為例,主循環(huán):
int i;

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

如果先從內(nèi)存取變量值為3到寄存器這個(gè)過(guò)程后,就發(fā)生了中斷,中斷里改變了內(nèi)存里這個(gè)變量的值為5,然后中斷結(jié)束,任務(wù)恢復(fù),讓后任務(wù)把寄存器里的3加1變成4,再放回內(nèi)存,那么是不是這個(gè)變量的值就會(huì)發(fā)生錯(cuò)誤?
回復(fù)

使用道具 舉報(bào)

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

單一的機(jī)器指令不會(huì)被打斷,所以不需要考慮原子操作問(wèn)題。

主貼我忘了回答volatile問(wèn)題,加不加volatile關(guān)鍵字跟原子操作沒(méi)任何關(guān)系。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

以我在沙發(fā)位的8位機(jī)例子為例,如果i是char型的,那么i++就是原子操作,無(wú)需保護(hù),主循環(huán)可以隨便改,中斷也可以隨便讀。

什么是原子操作?原子操作只有2種狀態(tài),一種是沒(méi)做,一種是做完了,看不到正在做的狀態(tài)。你連代碼會(huì)編譯成什么都不知道還是不要誤導(dǎo)他人了。
回復(fù)

使用道具 舉報(bào)

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

對(duì)的對(duì)的,你說(shuō)的是對(duì)的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品日韩一区二区 | 欧美久久一区 | 久草新在线 | 国内精品久久久久久 | 伊人久久综合 | 日韩成人在线免费观看 | 成人在线视频免费观看 | 九九热免费在线观看 | 日本特黄特色aaa大片免费 | 国产免费看 | 免费观看一级毛片 | 一区二区在线不卡 | 久久伦理中文字幕 | 亚洲天堂久久新 | 精品国产一区二区三区观看不卡 | 国产高清视频在线观看 | 欧美性久久 | 伊人一二三 | 欧美亚洲在线 | 欧美一区 | 欧美精品1区2区 | 日韩一区二区成人 | 亚洲成人一级片 | 欧美极品在线观看 | 欧美日韩亚洲三区 | 91精品久久久久久综合五月天 | 日本久久精 | 日本精品一区二区三区在线观看视频 | 爱爱爱av| 日韩精品一区二区三区视频播放 | 一区二区三区国产精品 | 亚洲精品久久久久久一区二区 | 国产精品国产亚洲精品看不卡15 | 国产一区二区精华 | 观看av| 国产三级精品三级在线观看四季网 | 亚洲国产欧美在线 | 国产99久久久国产精品 | 国产成人久久精品一区二区三区 | 欧美一区二区三区在线播放 | 国产91视频一区二区 |