0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

前言

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

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

排查思路

當(dāng)前未采用 qemu 調(diào)試,直接使用板子驗(yàn)證,所以就手動增加了一些 LOG,用戶態(tài)應(yīng)用與 內(nèi)核態(tài)的應(yīng)用,很快定位到是 內(nèi)核代碼 softwarekernelcomponentslibccompilerscommonctime.c 中的函數(shù) rt_timespec_to_tick 返回值異常導(dǎo)致的

1.jpg

開啟log 打印一下時(shí)間,就可以【正?!客顺?/p>

1.jpg

不開啟 log,發(fā)現(xiàn)卡住了,也就是 ipc 一直沒有超時(shí)

1.jpg

繼續(xù)排查

發(fā)現(xiàn) tick 計(jì)算的有問題,異常的 tick,也就是 IPC timeout 非常大

1.jpg

1.jpg

找到根源:int 型乘法計(jì)算溢出
tick = second * RT_TICK_PER_SECOND + nsecond * RT_TICK_PER_SECOND / NANOSECOND_PER_SECOND;,這里 nsecond 定義為 int 類型,int 是 32位,所以當(dāng) nsecond 較大時(shí),再乘上 RT_TICK_PER_SECOND, 也就是 1000,由于32位有符號整數(shù)溢出,變?yōu)榱恕矩?fù)值】。

而此時(shí) second 比較小,造成 tick 為一個(gè) 負(fù)值,但是 timeout 是無符號的,所以把一個(gè)負(fù)值當(dāng)成無符號數(shù),就是一個(gè)比較大的數(shù)值

1.jpg

解決方法

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

第二種:把 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);

小結(jié)

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

經(jīng)過了解 int 溢出,也發(fā)現(xiàn)了一些基礎(chǔ)性的知識點(diǎn),如 32位與64位 CPU 下, long long 類型都是 8字節(jié),如果使用 long 類型定義 nsecond,在 32位平臺上,是 4字節(jié),依舊是異常有問題

修復(fù)問題后,再次驗(yàn)證,發(fā)現(xiàn)定時(shí)比較的準(zhǔn)確了,偏差很小,比如 20秒,20000 個(gè) tick,而不是 19001 個(gè) tick

1.jpg

修復(fù)后,再次運(yùn)行的效果,此時(shí) 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()

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10807

    瀏覽量

    210852
  • IPC
    IPC
    +關(guān)注

    關(guān)注

    3

    文章

    337

    瀏覽量

    51772
  • 調(diào)試器
    +關(guān)注

    關(guān)注

    1

    文章

    300

    瀏覽量

    23668
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1261

    瀏覽量

    39841
  • qemu
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    5320
收藏 人收藏

    評論

    相關(guān)推薦

    通過Uboot?TFTP啟動rt-smart內(nèi)核

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

    RT-Smart的資料合集

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

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

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

    開機(jī)體驗(yàn)rt-smart:webserver網(wǎng)關(guān)

    軟件代碼交叉編譯成目標(biāo)系統(tǒng)平臺可以運(yùn)行的庫或二進(jìn)制文件,作為 rt-smart 的一個(gè)用戶 APP,并在 ART-Pi Smart 開發(fā)板上運(yùn)行。用戶也可以根據(jù) 文檔下面的章節(jié) “用戶 APP
    發(fā)表于 06-30 11:17

    D1S使用rt-smart驅(qū)動OLED

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

    D1S使用rt-smart驅(qū)動OLED

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

    樹莓派上rt-smart的應(yīng)用編程入門

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

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

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

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

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

    優(yōu)雅的在D1S上運(yùn)行RT-Smart

    前言 最近在學(xué)習(xí) RT-Smart ,正巧有在全志開發(fā)者論壇看到這么一篇帖子【驚】在麻雀上運(yùn)行國產(chǎn)rt-smart系統(tǒng),看到很多人都在關(guān)注 D1S 在 Smart 上的運(yùn)行情況。如今該
    的頭像 發(fā)表于 11-16 20:15 ?2751次閱讀

    絲滑的在RT-Smart用戶態(tài)運(yùn)行LVGL

    開發(fā)流程 1、RT-Smart 環(huán)境搭建 下載 RT-Smart 用戶態(tài)應(yīng)用代碼: 1 git?clone?https: //github.com/RT-Thread/userapps
    的頭像 發(fā)表于 11-22 20:20 ?1200次閱讀

    RT-Smart riscv64匯編注釋

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

    零基礎(chǔ)上手rt-smart適配bsp

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

    RT-Smart riscv64匯編注釋

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

    RT-Smart應(yīng)用開發(fā)筆記:fopen造成文件被清空問題的分析記錄

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