linux kernel将关键信息保存到文件做法 很好的调试方法
下面有2个示例:
1:保存机器从开机到结束的VBATT;
2:保存uart接收到的数据到文件;
意义不多说了。
以下是代码:
#include <linux/fs.h> #include <asm/uaccess.h> #include <asm/unaligned.h> static struct file *fp =NULL; int write_to_file (char *buf, int size) { int ret = 0; struct file *fp; mm_segment_t old_fs; loff_t pos = 0; int nwrite = 0; static int offset = 0; static int first_flag=0; /* change to KERNEL_DS address limit */ old_fs = get_fs(); set_fs(KERNEL_DS); if( first_flag==0){ first_flag=1; /* open file to write */ fp = filp_open("/data/at_log1", O_WRONLY|O_CREAT, 0640); if (!fp) { printk("%s: open file error\n", __FUNCTION__); ret = -1; goto exit; } } pos=(unsigned long)offset; /* Write buf to file */ nwrite=vfs_write(fp, buf, size, &pos); offset +=nwrite; exit: return ret; } int xxxx_exit(void){ if (fp) filp_close(fp, NULL); }1:保存VBATT与SOC:
static int adjust_soc(struct pm8921_bms_chip *chip, int soc, int batt_temp, int chargecycles, int rbatt, int fcc_uah, int uuc_uah, int cc_uah) { ------------ static char vbatt[100]; rc = pm8921_bms_get_simultaneous_battery_voltage_and_current( &ibat_ua, &vbat_uv); if (rc < 0) { pr_err("simultaneous vbat ibat failed err = %d\n", rc); goto out; } chip->vbat_mv= vbat_uv/1000; sprintf(vbatt,"%d %d\n",the_chip->vbat_mv,calculated_soc); write_to_file(vbatt,strlen(vbatt)); ---------- }2:将串口接收到的字符转化为16进制保存到文件中:
static void msm_serial_hs_rx_tlet(unsigned long tlet_ptr) { --------------- static char temp[1024]; rx_count = msm_hs_read(uport, UARTDM_RX_TOTAL_SNAP_ADDR); /* order the read of rx.buffer */ rmb(); if (0 != (uport->read_status_mask & CREAD)) { retval = tty_insert_flip_string(tty, msm_uport->rx.buffer, rx_count); if (retval != rx_count) { msm_uport->rx.buffer_pending |= CHARS_NORMAL | retval << 5 | (rx_count - retval) << 16; } if(rx_count<=512){ //memcpy(temp,msm_uport->rx.buffer,rx_count); for(i=0;i<rx_count;i++){ sprintf(temp+2*i,"%02x",msm_uport->rx.buffer[i]); write_to_file(temp,strlen(temp)); } } ---------------- }
时间: 2024-12-10 01:54:40