c語言編程中-斷言

c語音編程中-斷言使用

本文除了介紹assert在c語言編程的的使用,更重要的是在rtos系統編程中,configASSERT調試的方法。

一,assert函數

首先,介紹assert函數下c編程中的使用
測試程序如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

int max_fun(int *a,int *b)
{
        assert(*a > 50);

        int ret;

        ret = (*a > *b)?(*a):(*b);

        return ret;
}

int main(int argc, const char *argv[])
{
        int a;
        int b;
        int max_nb;

        scanf("%d",&a);
        getchar();
        scanf("%d",&b);
        getchar();

        printf("a:%d;b:%d\n",a,b);

        max_nb = max_fun(&a,&b);

        printf("[%s.%d]:max_nb:%d\n",__FUNCTION__,__LINE__,max_nb);

        return 0;
}

本例中輸入a的大小控制在大於50,否則程序出錯。

運行結果:
在這裏插入圖片描述
這個是assert在c語言中的簡單應用。

二,freertos中configASSERT應用

在freertos系統中,與其功能類似的的函數configASSERT在debug過程佔據這極其重要的位置,特別在程序運行不正常死機時,可以定位其問題,具體使用方法也很簡單。
FreeRTOS 內核中的關鍵點都會調用configASSERT(x),當x 爲0 的時候說明有錯誤發生;使用斷言的話會導致開銷加大,一般在調試階段使用。只需要在FreeRTOSConfig.h 文件中定義configASSERT()宏函數即可;
例如:

#define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)
#define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)

如上,程序出錯的地方就會被打印。

注意:此辦法只是調試程序的一種手段,並不能定位所有的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章