嵌入式C语言实用程序开发技巧 嵌入式C语言实用程序集锦1. 项目概述本文收集整理了嵌入式开发中常用的7个实用C语言程序涵盖数据转换、文件操作、IO控制等常见场景。这些程序经过实际项目验证可直接应用于嵌入式Linux、RTOS等开发环境。2. 实用程序详解2.1 十六进制字符串转整型数字功能说明将16进制字符串转换为10进制整型数字弥补标准库函数atoi/atol仅支持十进制转换的不足。实现原理int c2i(char ch) { if(isdigit(ch)) return ch - 48; if( ch A || (ch F ch a) || ch z) return -1; if(isalpha(ch)) return isupper(ch) ? ch - 55 : ch - 87; return -1; } int hex2dec(char *hex) { int len; int num 0; int temp; int bits; int i; char str[64] {0}; if(NULL hex) { printf(input para error \n); return 0; } if((0hex[0])((Xhex[1])||(xhex[1]))) { strcpy(str,hex[2]); } else { strcpy(str,hex); } len strlen(str); for(i0, temp0; ilen; i, temp0) { temp c2i(*(str i)); bits (len - i -1) * 4; temp temp bits; num num | temp; } return num; }技术要点支持0x/0X前缀识别采用位运算提高转换效率包含完善的错误检查机制2.2 通用字符串转整型功能扩展在2.1基础上增加对十进制字符串的支持实现十六进制/十进制字符串的自动识别转换。关键代码int String2int(char *strChar) { int len0; const char *pstrCmp10123456789ABCDEF; const char *pstrCmp20123456789abcdef; char *pstrNULL; int uiValue0; int j0; unsigned int t0; int i0; if(NULLstrChar) return -1; if(0(lenstrlen((const char *)strChar))) return -1; if(NULL!(pstrstrstr(strChar,0x))||NULL!(pstrstrstr(strChar,0X))) { pstr(char *)strChar2; if(0(lenstrlen((const char *)pstr))) return -1; for(i(len-1);i0;i--) { if(pstr[i]F) { for(t0;tstrlen((const char *)pstrCmp2);t) { if(pstrCmp2[t]pstr[i]) uiValue|(t(j*4)); } } else { for(t0;tstrlen((const char *)pstrCmp1);t) { if(pstrCmp1[t]pstr[i]) uiValue|(t(j*4)); } } } } else { uiValueatoi((const char *)strChar); } return uiValue; }2.3 创建填充文件工具应用场景嵌入式系统测试中需要生成特定大小的测试文件用于验证存储设备读写功能。实现方法#define FILL_DATA_VALUE 0x30 // 填充数据值 int main(int argc, char **argv) { FILE *l_pFile NULL; unsigned int l_WriteLen 0; unsigned int l_FileLen 0; unsigned char TempData[1024] {FILL_DATA_VALUE}; if(3!argc) { printf(usage: %s FileName FileLen \n , argv[0]); return 0; }; const char *l_pFileName argv[1]; l_FileLen ((0argv[2][0])((Xargv[2][1])||(xargv[2][1]))) ? hex2dec(argv[2]) : atoi(argv[2]); l_pFile fopen(l_pFileName,w); while(l_WriteLenl_FileLen) { int writeSize (l_FileLen1024) ? l_FileLen : 1024; int ret fwrite(TempData, 1, writeSize, l_pFile); if(ret 0) break; l_WriteLen ret; } if(NULL!l_pFile) { fclose(l_pFile); } return 0; }2.4 批量图片处理工具设计目的嵌入式设备采集的图片常包含固定格式的头部信息需要批量去除以节省存储空间。实现要点#define START_READ_POSITION 128 // 跳过前128字节 int Cut_file(char * InputFile) { FILE *l_pFileInput NULL; FILE *l_pFileOutput NULL; char l_ars8OutputName[128] {0}; unsigned char l_arru8TempData[1024] {0}; sprintf(l_ars8OutputName,./outfile/00%d.jpg,fileCounter); l_pFileInput fopen(InputFile,rb); l_pFileOutput fopen(l_ars8OutputName,w); fseek(l_pFileInput,START_READ_POSITION,SEEK_SET); while(!feof(l_pFileInput)) { int ret fread(l_arru8TempData,1,1024,l_pFileInput); if(ret0) { ret fwrite(l_arru8TempData,1,ret,l_pFileOutput); } } // 资源释放... }2.5 Hi3520DV300 GPIO控制程序硬件接口针对海思Hi3520DV300芯片的GPIO控制封装提供命令行读写接口。核心功能int main(int argc, char **argv) { unsigned char l_u8GPIONum atoi(argv[1]); unsigned char l_u8GPIOBit atoi(argv[2]); GPIO_GROUP_E l_eGpioGroup (GPIO_GROUP_E)l_u8GPIONum; GPIO_BIT_E l_eBit (GPIO_BIT_E)l_u8GPIOBit; if(3argc) { // 读取模式 HstGpio_Set_Direction(l_eGpioGroup, l_eBit, GPIO_INPUT); char bit_val 0; HstGpio_Get_Value(l_eGpioGroup, l_eBit, bit_val); printf(read Data %d \n,bit_val); } else if(4argc) { // 写入模式 GPIO_DATA_E l_eData (atoi(argv[3])0) ? GPIO_DATA_LOW : GPIO_DATA_HIGH; HstGpio_Set_Direction(l_eGpioGroup, l_eBit, GPIO_OUPUT); HstGpio_Set_Value(l_eGpioGroup,l_eBit,l_eData); } return 0; }2.6 文件数据插入工具应用场景嵌入式系统固件打包时需要将多个组件(bootloader、kernel等)合并到单一镜像文件。实现方法int InsertData(FILE *pfBasic, FILE *psInsert, int s32Position) { unsigned char l_arru8Temp[1024] {0xff}; fseek(pfBasic, s32Position, SEEK_SET); fseek(psInsert, 0, SEEK_SET); while(1) { int ret fread(l_arru8Temp, 1, 1024, psInsert); if(ret 0) { ret fwrite(l_arru8Temp, 1, ret, pfBasic); if(ret0) return -1; } else { break; } } return 0; }2.7 本地IP地址获取网络编程实用工具获取设备所有网络接口的IP地址支持多网卡场景。实现代码int get_local_ip(char *ps8IpList) { struct ifaddrs *ifAddrStruct; char l_s8IpAddr[INET_ADDRSTRLEN]; void *tmpAddrPtr; int l_s32IPCount 0; getifaddrs(ifAddrStruct); while(ifAddrStruct ! NULL) { if(ifAddrStruct-ifa_addr-sa_familyAF_INET) { tmpAddrPtr((struct sockaddr_in *)ifAddrStruct-ifa_addr)-sin_addr; inet_ntop(AF_INET, tmpAddrPtr, l_s8IpAddr, INET_ADDRSTRLEN); if(strcmp(l_s8IpAddr,127.0.0.1) !0) { memcpy(ps8IpList(l_s32IPCount*INET_ADDRSTRLEN), l_s8IpAddr, INET_ADDRSTRLEN); l_s32IPCount; } } ifAddrStructifAddrStruct-ifa_next; } freeifaddrs(ifAddrStruct); return l_s32IPCount; }3. 工程应用建议性能优化对于频繁调用的转换函数(如hex2dec)可考虑使用查表法替代计算错误处理实际项目中应增强错误检查特别是文件操作和内存分配平台适配GPIO控制部分需要根据具体芯片型号调整寄存器操作线程安全多线程环境下使用时需添加适当的同步机制4. 扩展应用方向将常用功能封装为动态库方便不同项目复用添加日志记录功能便于调试和问题追踪开发配套的Python脚本实现自动化测试针对特定嵌入式平台进行性能优化