嵌入式常用C/C++技巧

207 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

我们在日常的嵌入式开发中,经常会遇到各种C/C++的使用问题,并且C/C++纯软件的常用开发技巧有些嵌入式并不常用,而嵌入式开发中使用到的C/C++知识与技巧有些也非常特别,这里我们来具体介绍一下嵌入式开发常用技巧及C/C++知识。

宏定义与条件变量

#if…#else…#endif

我们在调试程序时,经常会遇到某段功能的实现,写了两种版本的程序,但调试时又不想来回切换。,这时候我们可以使用条件变量。
比如:想测试__set_FAULTMASK(1);和__disable_fault_irq();的区别,就可以使用如下方式,只需要更改#if后面是1还是0就可以选择是使用哪段程序。

	 #if 1
//	  
	__set_FAULTMASK(1);
        NVIC_SystemReset();	 
	#else
	 __disable_irq();
	 delay_ms(1000);
	  __disable_fault_irq();
    NVIC_SystemReset();
    #endif

选择是否使用串口调试

我们在程序开发过程时,往往使用串口进行程序的调试,但在产品成熟时,为了避免内存开销和其他的一些问题往往会去掉串口调试,这时候应该如何简单的去掉呢,下面我来介绍一下。

#define DEBUG_EN 1 //选择是否打开printf调试(串口一),1代表打开,0代表关闭
#if DEBUG_EN
    #define    DEBUG(fmt, ...)     do{ printf(fmt , ##__VA_ARGS__); }while(0)
#else
    #define    DEBUG    do{  }while(0);
#endif

我们通过上述程序,就可以实现串口调试的全部切换,非常方便。

memcpy函数

memcpy函数的用法,memcpy (void* _Dst,void const* _Src,size_t _Size)
memcpy函数是将后面地址的内容一个数据一个数据放在前面的地址,注意,是先放低位。
_Size是字节数,也就是说如果是32位数组,两个数组值就应该是_Size就应该是4。
例子:

char a[8]={0x12,0x34,0x56,0x78,0x90,0x14,0x52,0x46 };
short b=0;
memcpy(&b,a+1,2);
printf("b=%x", b);
此段代码的作用是把0x34和0x56拼接起来送到b,输出的最终结果是:0x5634。

字符串小写转大写

//将字符串中的小写字母转换为大写
//str:要转换的字符串
//len:字符串长度
void litterTobig(u8 *str,u8 len)
{
	u8 i;
	for(i=0;i<len;i++)
	{
		if((96<str[i])&&(str[i]<123))	//小写字母
		str[i]=str[i]-32;				//转换为大写
	}
}

字符串命令处理

通常我们在串口收发或者上下位机的控制中,会使用字符串进行命令的下发,但我们的单片机肯定使用数值会更容易控制些,所以我们可以使用一个控制函数和一些宏定义来完成。

  1. 宏定义命令

    //用于命令解析用的命令值 #define LED1ON 1 #define LED1OFF 2 #define BEEPON 3 #define BEEPOFF 4 #define COMMANDERR 0XFF

  2. 命令处理函数,将字符串命令转换成命令值

    //str:命令 //返回值: 0XFF,命令错误;其他值,命令值 u8 CommandProcess(u8 str) { u8 CommandValue=COMMANDERR; if(strcmp((char)str,"LED1ON")==0) CommandValue=LED1ON; else if(strcmp((char*)str,"LED1OFF")==0) CommandValue=LED1OFF; else if(strcmp((char*)str,"BEEPON")==0) CommandValue=BEEPON; else if(strcmp((char*)str,"BEEPOFF")==0) CommandValue=BEEPOFF; return CommandValue; }

  3. 使用方式

    Value=CommandProcess(CommandStr); //命令解析

此时Value就是我们转换成的命令数值(1、2、3、4这类)