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__)
如上,程序出錯的地方就會被打印。
注意:此辦法只是調試程序的一種手段,並不能定位所有的問題。