开发笔记
单纯分享,循序渐进。
一、Log打印
嵌入式软件开发过程中,串口打印信息也是一种常用且有效的调试方法。
打印函数的选择也是关键,根据打印的信息类型来选择更合适的。
如果是格式化输出变量的值,那么就选择printf标准输出函数,比较占用程序空间。
printfS("Datas:%dmA(L)-%dmA(R)-%dmA(C)-%dmV(L)-%dmV(R)-%dC(L)-%dC(R)-%.3fk(C)\r\n",EBL_mA,EBR_mA,CASE_mA,\
EB_L_vol,EB_R_vol,\
(short)EB_L_temp,(short)EB_R_temp,\
ntc_R);
如果只是打印字符串,那么就选择不占程序空间的特定串口输出函数。
#define LOG_INFO(strs) uart0_send_bytes(strs,sizeof(strs)-1)
LOG_INFO("Warning!!! case battery low\r\n");
二、编译选择
条件编译可以为开发人员提供灵活控制代码生成的能力,提高代码的可维护性、适应性等。
参考FreeRTOS
条件编译可以控制代码大小,妙用之处有这些:
1、调试与发布版本:在开发过程中,需要输出调试信息,功能完成后,关闭调试信息,减小代码体积,生成发布版本。
2、功能模块开和关:不同版本的软件,其功能也不同,通过条件编译控制某些功能模块启用或禁用。
2.1 关闭调试信息
#define debugLOG_INFO 1 //临时调试LOG信息
#define debugLOG_BASE 0 //基本事件log
......
#if (debugLOG_INFO == 1)
printfS("boost: 0x%x\r\n",(unsigned short)status);
#endif
......
#if (debugLOG_BASE == 1)
LOG_INFO("boost disable\r\n");
#endif
改变宏定义的值,1表示打开调试信息,0表示关闭调试信息。
2.2 启用或禁用功能模块
#define configUSE_COMM 1 //响应主机的串口指令
#define configUSE_UART 1 //printf调试接口使能
#define configUSE_ADC 1 //查看ADC
#define configUSE_XSENSE 0 //启用xSense模块
#define configUSE_LED 0 //灯模式
#define configUSE_EBVT 0 //耳机电压和温度
#define configUSE_NTC 1 //NTC检测
#define configUSE_SHEEP 1 //深度睡眠
#if (configUSE_NTC == 1)
Temprature_Deal(); //温度保护
#endif
#if (configUSE_XSENSE == 1)
boost_adapt();
#endif
......
#if (configUSE_XSENSE == 1)
adc_io_config(ADC_CHANNEL_0 | ADC_CHANNEL_4); //配置相应IO为ADC输入, ADC0采集NTC,ADC4采集xSense
#else
adc_io_config(ADC_CHANNEL_0); //配置相应IO为ADC输入, ADC0采集NTC
#endif
......
#if (configUSE_COMM == 1)
if (rx_flag == 1)
{
if (comm_timeout > 20)
{
comm_timeout = 0;
rx_flag = 2;
rx_count_ctr = rx_count;
rx_count = 0;
TX_Service_process();
}
}
#endif
改变宏定义的值,1表示启用功能模块,0表示禁用功能模块。