91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

程序小白
認證:優質創作者
所在專題目錄 查看專題
閑話內核——一切皆為程序片服務
可搶占式內核帶來的挑戰——并發
裸奔、事件驅動、傳統多任務到底孰優孰劣?
RTOS中的斷言機制——assert
作者動態 更多
基于stm32采用PWM驅動伺服控制器學習筆記
05-13 15:25
基于STM32驅動TM1638學習筆記——軟件篇
04-19 12:42
基于TM1638驅動8位數碼管設計分享
02-24 11:26
RT-Thread驅動之路: Studio創建FAL分區⑤
01-02 08:30
RT-Thread驅動之路: Studio 掛載通用SPI flash④
2024-12-23 13:41

RTOS中的斷言機制——assert

      在學習C語言的時候,相信很多小伙伴都會看過斷言這一章,但是從事嵌入式軟件開發的領域,我們卻很少用到斷言,在沒有接觸RTOS之前,我甚至不曉得斷言原來有如此大的作用。

      關于斷言的作用:確保軟件的正常運行,一旦出現異常進行及時止損的一種機制,斷言是在軟件運行階段的一種保護機制,并不存在于預處理和編譯階段。

      在RTOS中斷言的應用其實很簡單:

      RT_ASSERT(spi_dev_name); //斷言spi_dev_name存不存在

      具體的實現如下在:

#define RT_ASSERT(EX)                                                         \
if (!(EX))                                                                    \
{                                                                             \
    rt_assert_handler(#EX, __FUNCTION__, __LINE__);                           \
}

ASSERT 是通過宏定義實現的,判斷EX是否存在,如果不存在就執行rt_assert_handler函數;有個小知識點補充下,就是\的作用,如果沒有他,那么#define的宏定義只有當前行算數,有了它那么就是下面的內容也包括在宏定義中,\可以理解為連接符。

      執行的rt_assert_handler中有兩個參數比較特殊:__FUNCTION__和__LINE__這兩個是編譯器相關的參數:

__FUNCTION__:用于定位當前執行的函數:也就是函數名。

__LINE__:用于包含當前的行號,當前文件的行號。

rt_assert_handler函數的實現如下:

/**
 * The RT_ASSERT function.
 *
 * @param ex the assertion condition string
 * @param func the function name when assertion.
 * @param line the file line number when assertion.
 */
void rt_assert_handler(const char *ex_string, const char *func, rt_size_t line)
{
    volatile char dummy = 0;

    if (rt_assert_hook == RT_NULL)
    {
#ifdef RT_USING_MODULE
        if (dlmodule_self())
        {
            /* close assertion module */
            dlmodule_exit(-1);
        }
        else
#endif
        {
            rt_kprintf("(%s) assertion failed at function:%s, line number:%d \n", ex_string, func, line);
            while (dummy == 0);
        }
    }
    else
    {
        rt_assert_hook(ex_string, func, line);
    }
}

這個函數看著很復雜,其實分析起來,你會發現功能很簡單,首先RT_USING_MODULE宏并沒有定義,所以這塊可以直接忽略,假定rt_assert_hook = RT_NULL,那么實際執行的函數就只有:

rt_kprintf("(%s) assertion failed at function:%s, line number:%d \n", ex_string, func, line);
            while (dummy == 0);

打印斷言錯誤信息,包括錯誤內容,觸發函數,所在行號等信息。

然后進入while死循環,阻塞當前函數執行。

阻塞的目的是為了將當前線程的異常影響降到最低,這并不能保證整個軟件的功能正常,但是他能保證系統運行正常,方便我們定位錯誤以及調試異常。

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 3
收藏 3
關注 151
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 塔河县| 固安县| 崇文区| 科技| 侯马市| 鸡东县| 金寨县| 砚山县| 茂名市| 哈尔滨市| 吉隆县| 滦平县| 凌云县| 鲁山县| 永泰县| 邻水| 红原县| 叶城县| 民和| 介休市| 靖江市| 大埔县| 资阳市| 南乐县| 蚌埠市| 平顶山市| 巨鹿县| 河东区| 彩票| 静宁县| 宜城市| 泾川县| 喀喇沁旗| 滦南县| 沅陵县| 东乡| 红原县| 谷城县| 凌海市| 桦甸市| 怀仁县|