嵌入式Linux系统实用代码片段解析与应用
嵌入式系统实用代码片段解析与应用1. CPU温度监测实现1.1 温度监测原理在嵌入式Linux系统中CPU温度信息通常通过虚拟文件系统暴露给用户空间。系统会在/sys/devices/virtual/thermal/thermal_zone*/temp路径下提供温度数据该文件包含以毫摄氏度为单位的整数值。1.2 代码实现分析#include stdio.h #include unistd.h #include stdlib.h #include string.h #include errno.h #define CPU_TEMP_FILE0 /sys/devices/virtual/thermal/thermal_zone0/temp struct cpu_temperature { int integer_part; int decimal_part; }; typedef struct cpu_temperature cpu_temperature_t; cpu_temperature_t get_cpu_temperature(const char *_cpu_temp_file) { FILE *fp NULL; cpu_temperature_t cpu_temperature {0}; int temp 0; fp fopen(_cpu_temp_file, r); if (NULL fp) { printf(fopen file error\n); return cpu_temperature; } fscanf(fp, %d, temp); cpu_temperature.integer_part temp / 1000; cpu_temperature.decimal_part temp % 1000 / 100; fclose(fp); return cpu_temperature; } int main(int arc, char *argv[]) { cpu_temperature_t cpu_temperature {0}; cpu_temperature get_cpu_temperature(CPU_TEMP_FILE0); printf(cpu_temperature %d.%d ℃\n, cpu_temperature.integer_part, cpu_temperature.decimal_part); return 0; }1.3 工程应用场景系统过热保护机制异常崩溃分析性能优化监控散热系统控制2. 文件大小获取实现2.1 文件操作原理在Unix-like系统中获取文件大小的标准方法是使用文件指针定位到文件末尾然后查询当前位置。这种方法避免了直接读取文件内容效率较高。2.2 代码实现分析#include sys/stat.h #include unistd.h #include stdio.h long get_file_size(const char *_file_name) { FILE * fp fopen(_file_name, r); if (NULL fp) { printf(fopen error\n); return -1; } fseek(fp, 0L, SEEK_END); long size ftell(fp); fclose(fp); return size; } int main() { #define FILE_NAME ./get_file_size long file_size get_file_size(FILE_NAME); printf(file_size %ld\n, file_size); return 0; }2.3 工程应用场景文件传输前的容量检查存储空间管理日志文件轮转控制固件升级包验证3. 系统时间戳获取实现3.1 时间获取原理Unix系统提供了gettimeofday()系统调用可以获取微秒级精度的时间信息。该函数返回自1970年1月1日以来的秒数和微秒数。3.2 代码实现分析#include stdio.h #include unistd.h #include stdlib.h #include string.h #include errno.h #include sys/time.h #include time.h long long get_sys_time_ms(void) { long long time_ms 0; struct timeval sys_current_time; gettimeofday(sys_current_time, NULL); time_ms ((long long)sys_current_time.tv_sec*1000000 sys_current_time.tv_usec) / 1000; return time_ms; } int main(int arc, char *argv[]) { long long cur_sys_time get_sys_time_ms(); printf(cur_sys_time %lld ms\n, cur_sys_time); return 0; }3.3 工程应用场景系统日志时间戳性能测试计时任务调度控制数据采集同步4. 网络接口信息获取4.1 MAC地址获取实现4.1.1 实现原理通过socket接口和ioctl系统调用可以查询网络接口的硬件地址信息。SIOCGIFHWADDR命令专门用于获取硬件地址。4.1.2 代码实现#include stdio.h #include net/if.h #include sys/ioctl.h #include arpa/inet.h #include unistd.h #include string.h int get_netif_mac(const char *_ifr_name, uint8_t *_mac) { int32_t ret -1; struct ifreq m_ifreq; int32_t sock 0; sock socket(AF_INET, SOCK_STREAM, 0); if (sock 0) { printf(socket err\r\n); goto err; } strcpy(m_ifreq.ifr_name, _ifr_name); ret ioctl(sock,SIOCGIFHWADDR, m_ifreq); if (ret 0) { printf(ioctl err:%d\r\n,ret); goto err; } snprintf((char *)_mac, 32, %02x%02x%02x%02x%02x%02x, (uint8_t)m_ifreq.ifr_hwaddr.sa_data[0], (uint8_t)m_ifreq.ifr_hwaddr.sa_data[1], (uint8_t)m_ifreq.ifr_hwaddr.sa_data[2], (uint8_t)m_ifreq.ifr_hwaddr.sa_data[3], (uint8_t)m_ifreq.ifr_hwaddr.sa_data[4], (uint8_t)m_ifreq.ifr_hwaddr.sa_data[5]); return 0; err: return -1; } int main(int argc, char **argv) { char mac_str[32] {0}; get_netif_mac(wlan1, mac_str); printf(mac %s\n, mac_str); return 0; }4.2 IP地址获取实现4.2.1 实现原理通过SIOCGIFADDR ioctl命令可以获取网络接口的IP地址信息。该命令会返回包含IP地址的sockaddr_in结构。4.2.2 代码实现#include stdio.h #include net/if.h #include sys/ioctl.h #include arpa/inet.h #include unistd.h #include string.h int get_local_ip(const char *_ifr_name, char *_ip) { int ret -1; int sockfd; struct sockaddr_in sin; struct ifreq ifr; sockfd socket(AF_INET, SOCK_DGRAM, 0); if (-1 sockfd) { printf(socket error\n); return ret; } strncpy(ifr.ifr_name, _ifr_name, IFNAMSIZ); ifr.ifr_name[IFNAMSIZ - 1] 0; if (ioctl(sockfd, SIOCGIFADDR, ifr) 0) { printf(ioctl error\n); close(sockfd); return ret; } memcpy(sin, ifr.ifr_addr, sizeof(sin)); int ip_len snprintf(_ip, 32, %s, inet_ntoa(sin.sin_addr)); close(sockfd); ret ip_len; return ret; } int main(int argc, char **argv) { char ip_str[32] {0}; get_local_ip(wlan1, ip_str); printf(ip %s\n, ip_str); return 0; }4.3 工程应用场景设备唯一标识生成网络配置验证设备发现协议网络故障诊断