您的位置:首页 > 运维架构 > Linux

linux kernel将buf保存到文件做法 很好的调试方法

2014-09-05 21:46 232 查看
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));
}

}
----------------
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息