最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

單片機(jī)的三大秘境之揭秘 KEIL 調(diào)試那些不為人知的事

2022-05-12 15:01 作者:大方老師單片機(jī)課堂  | 我要投稿

單片機(jī)的三大秘境之 KEIL調(diào)試那些不為人知的事


///插播一條:我自己在今年年初錄制了一套還比較系統(tǒng)的入門單片機(jī)教程,想要的同學(xué)找我拿就行了免費(fèi)的,私信我就可以~點(diǎn)我頭像黑色字體加我地球呺也能領(lǐng)取哦。最近比較閑,帶做畢設(shè),帶學(xué)生參加省級(jí)或以上比///


導(dǎo)讀:授人以魚(yú)不如授人以漁,為什么那些前輩們能快速定位問(wèn)題,這個(gè)系列的文章將揭 KEIL調(diào)試那些不為人知的事。

以下內(nèi)容更適用 STM32單片機(jī)51也支持部分)。掌握了它們將加速你的調(diào)試速度,不信嗎?試試看咯。

程序中最重要的是什么,數(shù)據(jù)。很多時(shí)候程序運(yùn)行有問(wèn)題和你的數(shù)據(jù)密切相關(guān),如果你能實(shí)時(shí)觀察程序中的數(shù)據(jù),你覺(jué)得如何?

數(shù)據(jù)分為兩種,一種是可變的,一種為不可變的。比 RAM數(shù)據(jù)為可變的,FLASH數(shù)據(jù)為不可變的(實(shí)際上也能改變,不然你怎么把程序燒寫(xiě) FLASH中呢),還有一種極其特殊的存在:寄存器數(shù)據(jù)。

1、變量查看

首先說(shuō)說(shuō)可變數(shù)據(jù)的查看方式,比如你聲明的一些變量,可以通過(guò) Watch窗口查看。

通過(guò)以下方式可打開(kāi) Watch窗口(任選一個(gè)窗口打開(kāi)即可):


在這里可以查看變量(這里選 Watch 1):


是否發(fā)現(xiàn)上面的顯示不太對(duì)勁?>,這是啥意思?這個(gè)是說(shuō) KEIL無(wú)法找到這個(gè)變量。就我所知,有兩種情況會(huì)出現(xiàn)這種現(xiàn)象:

1)、這個(gè)變量不存在:有可能你之前聲明過(guò)這個(gè)變量,后來(lái)發(fā)現(xiàn)沒(méi)用到,刪除了。

2)、使 static聲明的變量。

比如像這樣:


如果是第二種情況,那么可以通過(guò)將程序運(yùn)行到使用該變量的地方,然后停止就可以查看了。

添加變量:

那么如何添加你需要查看的變量呢?通??梢允褂萌缦路椒ǎ?/span>

1)、光標(biāo)處于變量位置,然后右擊會(huì)出現(xiàn)一個(gè)界面,最后選擇添加到你需要的窗口:


2)、直接將你的變量拖到你 Watch窗口(前提是你已經(jīng)打開(kāi) Watch窗口):


3)、復(fù)制變量名,然后將變量名粘貼在窗口里面就可以了。

移除變量

能添加,也就能移除,可以通過(guò)以下方法移除你的變量(注意程序應(yīng)該處于停止?fàn)顟B(tài)):


當(dāng)然還有一種方法就是直接刪除這個(gè)變量名,這也可以達(dá)到移除的效果。

如果你希望使用十進(jìn)制的方式顯示你的數(shù)據(jù),那么試試去掉上面 Hexadecimal Display勾選吧。

2、內(nèi)存查看

如果你想查 FLASH的數(shù)據(jù)怎么辦?那么試試這個(gè)窗口:


比如說(shuō)你想看 FLASH地址開(kāi)始處是什么數(shù)據(jù),只要 0x0800 0000輸入進(jìn)去后按回車鍵就可以了(注意數(shù)字中間沒(méi)有空格,只是為了看起來(lái)方便才用空格分開(kāi)的):


四字節(jié)顯示不爽?那試試改變顯示格式吧,無(wú)符號(hào),有符號(hào),char、intfloat任你選(如果不想用十進(jìn)制表示,必須去 Decimal的勾選):


如果需要修改某個(gè)地址的數(shù)據(jù),也可以通過(guò)上面的方式在某個(gè)數(shù)據(jù)上右擊后選擇修改Modify)。

事實(shí)上,除 FLASH數(shù)據(jù)RAM數(shù)據(jù)也是可以通過(guò)它觀察的:


從這里可以看到,Memory在數(shù)據(jù)顯示上 Watch窗口更強(qiáng)大,它可以對(duì)單片機(jī)上的所有數(shù)據(jù)進(jìn)行查看,缺點(diǎn)就是你不知道誰(shuí)是誰(shuí)了(沒(méi)有變量名顯示,只能靠地址分辨了)。

對(duì)于以上知識(shí)可能很多人都了解過(guò),下面說(shuō)一說(shuō)一般人不知道的點(diǎn):

對(duì)于單片機(jī)來(lái)說(shuō),片上外設(shè)決定了你單片機(jī)的功能,所以多數(shù)情況下都需要查看外設(shè)寄存器的值,那么該如何查看呢?

過(guò) Watch窗口就可以了。怎么做?

以最為常用的串口外設(shè)為例說(shuō)明:


之后你就可以看到寄存器的內(nèi)容了:


是不是很方便啊。那到底添加什么標(biāo)志符才能顯示出來(lái)呢?實(shí)際上這個(gè)標(biāo)志符就是那些外設(shè)宏定義了。怎么看?前面魚(yú)鷹說(shuō)過(guò)搜索也算一個(gè)調(diào)試功能,那你在工程內(nèi)搜索之后就會(huì)發(fā)現(xiàn)這個(gè)定義:


明白了吧,你輸入 USART1其實(shí)就是一個(gè)指針,然 KEIL就會(huì)從這個(gè)地址里讀出數(shù)據(jù)并按照你的指針結(jié)構(gòu)體顯示出來(lái)。知道了這個(gè),你應(yīng)該也就知道該如何查 GPIOSPI等外設(shè)了。

其實(shí)這里還有一個(gè)額外的好處,不知道你是否發(fā)現(xiàn)了。我們都知道,使用宏定義雖好,但它有一個(gè)很麻煩的地方,就是不能很直觀的知道這個(gè)值到底是多少,那么通過(guò)這個(gè)你也就可以知 USART1的值就 0x4001 3800了,也就 USART1 外設(shè)基地址就是它:


事實(shí)上通過(guò) Memory窗口也是可以的:


只是沒(méi) Watch窗口那么直觀罷了。

那么為什么需要支持這兩種方式呢?我們知道有些變量空間非常大,比如串口緩存數(shù)組,可能有好K,如果你通過(guò) Watch窗口查看的話,你會(huì)發(fā)現(xiàn)它會(huì)嚴(yán)重干擾你的程序運(yùn)行,表現(xiàn)情況就是數(shù)據(jù)刷新緩慢,但是通過(guò) Memory就不一樣了,相當(dāng)流暢。所以如果你要看大數(shù)據(jù)的話, Memory效果最好。

還有一個(gè)好處就是,它能隨時(shí)更改變量的顯示方式,比如說(shuō)你把一個(gè)浮點(diǎn)數(shù)據(jù)放在了四個(gè)字節(jié)數(shù)組變量中,那么我想查看這個(gè)浮點(diǎn)數(shù)據(jù)是什么怎么辦,我不可能通過(guò)浮點(diǎn)數(shù)據(jù)的存儲(chǔ)格式手工計(jì)算一下吧?如果你能計(jì)算出來(lái)還好,說(shuō)明你很厲害,但是萬(wàn)一不懂存儲(chǔ)格式或者計(jì)算錯(cuò)了呢?使 Memory就不同了,你只要把這個(gè)數(shù)組的地址給它,然后設(shè)置顯示方式為浮點(diǎn)型就可以了,相當(dāng)方便。還有就是當(dāng)使用宏定義時(shí),查看這個(gè)宏定義的值非常不方便,使 Memory就可以輕松查看。

比如查 USART1 DR寄存器地址, Watch窗口顯示是這樣的:


如果你要知 DR的地址,你就需要通過(guò)基地 0x400 13800和偏移地 0x04知道它的地址 0x400 13804,即使 Watch單獨(dú)查 DR也是一樣:


但是通過(guò) Memory就是這樣的:


這里千萬(wàn)要注意的是要使用取地址 &,否則它就變成了這樣:


外設(shè)地址怎么可能0,所以肯定錯(cuò)了。

事實(shí)上你 Watch也是可以的,但顯得比較詭異,會(huì)讓你覺(jué)得這是一個(gè)指針變量:


實(shí)際上它只是一個(gè)常量而已,并不是指針變量。

在這里你會(huì)發(fā)現(xiàn),這些窗口支持運(yùn)算符,看這個(gè):


還有這個(gè):


變量的查看也是如此,是不是特別方便啊。需要注意的是,Watch窗口 Memory都支持在線修改數(shù)據(jù),對(duì)于需要臨時(shí)更改數(shù)據(jù)情況下非常有用。

單片機(jī)的三大秘境之揭秘 KEIL 調(diào)試那些不為人知的事的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
朔州市| 大埔县| 伊春市| 丹江口市| 五莲县| 微山县| 梓潼县| 常宁市| 喀喇| 青阳县| 马公市| 德清县| 潞城市| 东丽区| 鸡西市| 金坛市| 上虞市| 曲周县| 龙井市| 邢台市| 新和县| 连江县| 罗平县| 靖州| 东丽区| 渭南市| 德令哈市| 抚远县| 定日县| 三河市| 靖西县| 南丹县| 扶绥县| 武鸣县| 琼结县| 电白县| 扶沟县| 剑川县| 盈江县| 固镇县| 宜兴市|