精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RT-Smart開發筆記:int類型數值溢出造成的奇怪問題的分析與排查記錄

冬至子 ? 來源:張世爭 ? 作者:張世爭 ? 2023-10-31 16:16 ? 次閱讀

前言

最近在調試 RT-Smart 上的用戶態 mq(消息隊列)時,遇到一個奇怪的問題,這個例程打印了一下獲取的時間,就可以正常的工作(超時退出),否則,就一直卡住(無法超時)

雖然沒有認真的閱讀用戶態 mq 的具體實現代碼,大概能了解到底層對接了 IPC 消息隊列,如果一直卡住,可能的原因是超時時間參數沒有正確傳遞下?

排查思路

當前未采用 qemu 調試,直接使用板子驗證,所以就手動增加了一些 LOG,用戶態應用與 內核態的應用,很快定位到是 內核代碼 softwarekernelcomponentslibccompilerscommonctime.c 中的函數 rt_timespec_to_tick 返回值異常導致的

1.jpg

開啟log 打印一下時間,就可以【正常】退出

1.jpg

不開啟 log,發現卡住了,也就是 ipc 一直沒有超時

1.jpg

繼續排查

發現 tick 計算的有問題,異常的 tick,也就是 IPC timeout 非常大

1.jpg

1.jpg

找到根源:int 型乘法計算溢出
tick = second * RT_TICK_PER_SECOND + nsecond * RT_TICK_PER_SECOND / NANOSECOND_PER_SECOND;,這里 nsecond 定義為 int 類型,int 是 32位,所以當 nsecond 較大時,再乘上 RT_TICK_PER_SECOND, 也就是 1000,由于32位有符號整數溢出,變為了【負值】。

而此時 second 比較小,造成 tick 為一個 負值,但是 timeout 是無符號的,所以把一個負值當成無符號數,就是一個比較大的數值

1.jpg

解決方法

第一種,把 nsecond 定義為 int64_t 類型,也就是 long long 類型,這樣計算時,會按照 64位計算,不會溢出

第二種:把 tick = second * RT_TICK_PER_SECOND + nsecond * RT_TICK_PER_SECOND / NANOSECOND_PER_SECOND; 改為 tick = second * RT_TICK_PER_SECOND + nsecond / (NANOSECOND_PER_SECOND / RT_TICK_PER_SECOND);

小結

這問題,如果粗心一點,可能會直接【放過】,比如加了 LOG 打印發現沒有問題,但是細節決定成敗,有些 BUG 可能出現的方式很奇特,這就是測試代碼需要有一定的覆蓋性,各個場景下都需要驗證,比如 Debug 版本、 Release 版本都測試一下,看看現象是否一致。

經過了解 int 溢出,也發現了一些基礎性的知識點,如 32位與64位 CPU 下, long long 類型都是 8字節,如果使用 long 類型定義 nsecond,在 32位平臺上,是 4字節,依舊是異常有問題

修復問題后,再次驗證,發現定時比較的準確了,偏差很小,比如 20秒,20000 個 tick,而不是 19001 個 tick

1.jpg

修復后,再次運行的效果,此時 tick = 19994,與 20秒比較匹配

msh /kernel>./mq_test
msh /kernel>31111111111111111111111111111
msg_queue is 3
main : enter
sys_mq_timedreceive : 5974 1514764824-963161303
tp : 1676378 - 1514764804
tm_spec : 1676378 - 1514764824
rt_timespec_to_tick : line - 730, second : 19, nsecond : 994459929
rt_timespec_to_tick : tick = 19994
mq_timedreceive : tick = 19994
mq_receive()

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10702

    瀏覽量

    209388
  • IPC
    IPC
    +關注

    關注

    3

    文章

    333

    瀏覽量

    51623
  • 調試器
    +關注

    關注

    1

    文章

    297

    瀏覽量

    23569
  • RT-Thread
    +關注

    關注

    31

    文章

    1239

    瀏覽量

    39438
  • qemu
    +關注

    關注

    0

    文章

    57

    瀏覽量

    5298
收藏 人收藏

    評論

    相關推薦

    通過Uboot?TFTP啟動rt-smart內核

    介紹Windows下通過 Uboot??TFTP 方式下載和啟動rt-smart 內核
    的頭像 發表于 06-30 12:34 ?3505次閱讀
    通過Uboot?TFTP啟動<b class='flag-5'>rt-smart</b>內核

    RT-Smart的資料合集

    的,因此能夠很好地緩解外部碎片的問題。下圖表達了伙伴系統的基本思想,基于伙伴塊進行分裂與合并。3、使用GDB對RT-Smart進行代碼調試的方法在開發的過程中,有時沒有現成的圖形化開發環境,想要進行調試
    發表于 03-22 15:06

    rt-smart中斷阻塞問題是怎么引起的

    rt-smart 中斷阻塞問題如何解決?該問題是怎么引起的?為了測試rt-smart的實時性,測試了一下中斷的穩定性。用systick的1ms中斷做測試源。平時都正常的,但是發現打印時,波形老是抖動
    發表于 03-25 09:56

    開機體驗rt-smart:webserver網關

    軟件代碼交叉編譯成目標系統平臺可以運行的庫或二進制文件,作為 rt-smart 的一個用戶 APP,并在 ART-Pi Smart 開發板上運行。用戶也可以根據 文檔下面的章節 “用戶 APP
    發表于 06-30 11:17

    D1S使用rt-smart驅動OLED

    D1S使用rt-smart驅動OLED前言本次使用RT-Smart的IIC驅動OLED屏幕,進行基本的字符串顯示,在使用的過程中遇到一些問題,在這里做記錄分享,本次以熟悉RT-Smart
    發表于 03-25 11:06

    D1S使用rt-smart驅動OLED

    ,進行基本的字符串顯示,在使用的過程中遇到一些問題,在這里做記錄分享,本次以熟悉RT-Smart使用為主。過程本次直接開始添加離線包,環境搭建請參考上一篇文章:https://bbs.aw-ol.com
    發表于 04-03 11:27

    樹莓派上rt-smart的應用編程入門

    我們從現在開始會逐步連載RT-Thread Smart(簡稱rt-smart,甚至有時會稱為smart os)的介紹文章,旨在讓大家認識,接觸到sm
    的頭像 發表于 05-13 14:10 ?2981次閱讀
    樹莓派上<b class='flag-5'>rt-smart</b>的應用編程入門

    i.MX RT開發筆記-08 | i.MX RT1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)

    系列文章目錄i.MX RT開發筆記-01 | 初識 i.MX RT1062 跨界MCUi.MX RT開發筆記-02 | i.MX
    發表于 12-01 13:51 ?2次下載
    i.MX <b class='flag-5'>RT</b><b class='flag-5'>開發筆記</b>-08 | i.MX <b class='flag-5'>RT</b>1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)

    rt-smart移植分析:從樹莓派3b入手

    移植rt-smart到最新的板子上具體需要注意哪些細節,哪些才是移植rt-smart的關鍵點?本文從樹莓派3b上移植rt-smart的角度,從頭分析
    發表于 01-25 18:48 ?0次下載
    <b class='flag-5'>rt-smart</b>移植<b class='flag-5'>分析</b>:從樹莓派3b入手

    優雅的在D1S上運行RT-Smart

    前言 最近在學習 RT-Smart ,正巧有在全志開發者論壇看到這么一篇帖子【驚】在麻雀上運行國產rt-smart系統,看到很多人都在關注 D1S 在 Smart 上的運行情況。如今該
    的頭像 發表于 11-16 20:15 ?2585次閱讀

    絲滑的在RT-Smart用戶態運行LVGL

    開發流程 1、RT-Smart 環境搭建 下載 RT-Smart 用戶態應用代碼: 1 git?clone?https: //github.com/RT-Thread/userapps
    的頭像 發表于 11-22 20:20 ?1116次閱讀

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統初始化和異常處理的代碼倉庫地址https://gitee.com/rtthread/rt
    的頭像 發表于 02-08 21:40 ?1025次閱讀

    零基礎上手rt-smart適配bsp

    RT-Thread Smart(簡稱rt-smart)是基于RT-Thread操作系統衍生,面向帶MMU(Memory Management Unit),中高端應用的芯片,例如ARM
    的頭像 發表于 08-08 10:34 ?796次閱讀
    零基礎上手<b class='flag-5'>rt-smart</b>適配bsp

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統初始化和異常處理的代碼
    的頭像 發表于 10-12 17:26 ?508次閱讀
    <b class='flag-5'>RT-Smart</b> riscv64匯編注釋

    RT-Smart應用開發筆記:fopen造成文件被清空問題的分析記錄

    RT-Smart 應用(apps)開發環境,ubuntu 20.04 + win10 VS Code
    的頭像 發表于 10-20 16:01 ?468次閱讀
    <b class='flag-5'>RT-Smart</b>應用<b class='flag-5'>開發筆記</b>:fopen<b class='flag-5'>造成</b>文件被清空問題的<b class='flag-5'>分析</b><b class='flag-5'>記錄</b>