国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

從 Kinetis 的 sample code 中的一個例程說起

發布時間:2013-8-27 14:39    發布者:絕對好文
關鍵詞: Kinetis , 例程
作者:allen_zhan  

[前言]


在前文"關于 FREESCALE 的 DEMO 中 PSOR與PCOR 操作的常見錯誤 "中, 我們討論了 kinetis L series 的 Sample 中容易出現的, 關于 PSOR 的常見錯誤, 我們分析, 這種錯誤, 大致可能與未曾熟讀 RM 有關.

在之后對 kinetis L series 的 samples 繼續短暫的了解過程中, 我們發現參考例程其他的較明顯的錯誤, 或者說不足疏漏之處.

因其常常表現為 uController 的新生容易發生的錯誤, 故我想稱其為"初學者錯誤", 或者說是"初學者不足".

[例程]
讓我們引 Blinky sample 中的, 開啟 Interrupt 的例程作為例子, 如下圖例1:

[圖例1: Blinky sample 中的使能例程]



這個例程, 讓我們覺得不能沉默以對.

因為, 作為 Freescale 官方例程, 可能類似的代碼會被我們國內的初學者諸君, 作為效仿的對象. 從而產生錯誤的引導效果, 不利于我們工程師的自我完善和提升.

[可能的疏漏或錯誤]
這里我們想主要指出, 這段短短的例程中可能出現的 4 個不足:

(1) 首先, 這個 (irq%32) 浪費代碼空間并影響效率.
    -- 其本質原因, 可能存在著邏輯上混淆不清.

(2) 其次, IRQ的值域為: [0, 31]. 而該 code sample 卻允許對 32 的計算.
    -- 其本質原因, 應該是未作越界(邊界)檢查. 并未仔細閱讀 Register bit field定義.

(3) 第三, 對 irq=31 時的可能情況, 也就是 (1<<31) 的情況, 毫無敏感.
    -- 這里毫無敏感的意思, 大致反應為: (a) 對有符號數與無符號數區別不敏感, (b) 對左移操作不敏感.

(4) 第四, 正如同我們在 PSOR 中分析到的 |= 錯誤, 在這段簡單的例程中, 仍然存在 ICPR 在 bit 被 write 0時無任何影響,  ISER 在 bit 被 write 0 時無任何影響. 都應該改為 =.

[討論(1<<31)的特例]

讓我們用例子來討論這個 (1<<31):
(1) 首先, IAR 中定義的常量, 都是有符號的 int 類型.

這個前提為大家公認, 但是我沒有找到出處```
麻煩讀到此處的同行, 能給我一個出處鏈接, 或者是 IAR help documentation 中的說明. 蟹蟹.

(2) 有符號數 1, 在左移 31 bit 后, 將導致符號位被置1, 也就是計算得到一個負整數.

如果我們只看這里 NVIC_ICPR |= 1 << 31; 似乎沒有影響到最終邏輯結果.
但是, 其真實原因是, 該負整數被強制轉化為 unsigned int 的結果, 也即是最終正確的 0x80000000.

但這并不表示, coder 清楚這個結果是由強制轉換產生,

從這段代碼本身, 我們合理判斷該 coder 將分不清下面代碼的執行結果, 也就是容易犯一些"初學者錯誤".

比方說: 我懷疑該 coder 會毫無自覺寫出下面的代碼:
if( (1<<31) > 1 ) { do what he wants; }

顯然我們知道, 這片代碼永遠不能為真, 去執行 what he want to do.

(3) 根據圖例2, 我們對 (1<<31) 進行詳論:

[圖例2: Allen 隨手編碼給出3個例子討論 (1<<31) ]



我們把3個例子的結果, 都有注釋, 可以見到:
(a) (1<<31) 的值, 不是正數 0x80000000, 而是負數 -2147483648.
(b) (1u<<31) 的值, 才是 0x80000000.
(c) 條件比較語句, 首先是兩邊轉化為同類型才能比較. 由于無符號數優先級高于 int, 故 (1<<31) 被強制轉化為 unsigned int, 也就是 0x80000000, 用于比較, 導致和 sample1 的結果截然不同.

上面3個例子, 清楚表明了 (1<<31) 的值為何(如果我有任何錯誤請告訴我).

[我們修改的代碼]
因此, Allen 嘗試修改這個例程如下, 見圖例3:

[圖例3: 被修改后的例程]



[結論]
我們通過對一個 enable interrupt 例程的修改, 討論了 firmware programmer 可能容易犯的問題, 主要有:
(1) 不能熟讀 datasheet, 了解 register 的具體用法.
(2) 代碼邏輯混亂.
(3) 忽視邊界檢查.
(4) 對有符號和無符號數區別不夠重視.
(5) 不了解左移時牽涉符號位的特例.
(6) 不清楚在條件比較時強制轉換現象.

上述問題, 一般多見于 uController 的初級選手.

作為公司新晉員工, 或者任何致力于 MCU code 實現 application 的新進同行們, 可以將上述錯誤作為范例保存而自省.

另外, 我們說不定應謹慎檢閱各種 Freescale 給出的 kinetis L series 的參考 samples, 反復測試, 可能避免出貨后造成不可預料之損失.

本文地址:http://m.qingdxww.cn/thread-120005-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩免费福利视频 | 亚洲三级网| 韩国免费一级片 | 亚洲热影院 | 欧美成人中文字幕在线看 | 日韩 欧美 中文字幕 不卡 | 欧美69精品国产成人 | 久久99国产精品成人 | 日韩激情视频网站 | 在线精品日韩一区二区三区 | 在线观看麻豆国产精品 | 九九热精品在线 | 欧美高清360 | 美女又爽又黄视频 | 亚洲一区二区视频在线观看 | www.天堂网.com | 老潮湿影院免费体验区 | www国产永久免费视频看看 | 国产精品东方伊甸园 | 日本大片成人免费播放 | 午夜视频在线播放 | 日本夫妇交换456高清 | 亚洲一区视频在线 | 在线视频一区二区三区在线播放 | 大胸年轻的搜子4理论 | 欧美一区1区三区3区公司 | 色婷五月综激情亚洲综合 | 在线欧美精品二区三区 | 二区三区在线观看 | 黄色短片免费看 | 蜜桃tv在线观看 | 国产精品高清一区二区三区 | 自拍视频在线看 | 欧美一区二区三区视频 | 国产精品毛片大码女人 | 在线播放第一页 | 天天久久狠狠色综合 | 91在线网站 | 国产精品入口麻豆免费 | 99久久精品免费精品国产 | 天天爱天天干天天操 |