之前尝试了做控制仿真,对于着实有点难了。我把工作重新转移回电机控制了,开始从头开始构建电机控制的软件,以及对应的上位机。这个过程很费人,所面临的不在是一个点,是很多面。想要做的还凑合,都需要做很多次取舍,计较。
介绍一下单片机裸机编程中,简单的log打印信息的功能。
- 程序稍微比较大,找bug的时候,打印信息是一个很好的帮手
- 程序的遇到的状态信息,错误信息,警告
- 屏蔽一些不重要的信息
大概需求就是
- 打印信息有等级,级别
- 可以设置打印等级信息
#ifndef _SYS_LOG_H_
#define _SYS_LOG_H_
#include <stdint.h>
#include <string.h>
typedef enum {
LOG_DEBUG = 0x01,
LOG_INFO = 0x02,
LOG_WARN = 0x04,
LOG_ERR = 0x08,
LOG_ASSERT = 0x10,
}LOG_LV;
void bind_log_calbk( void (*log_calbk)(uint8_t *str, uint32_t len));
void set_log_rule(uint8_t rule);
void sys_log(LOG_LV lv, uint8_t *str);
#define LOGD(a) sys_log(LOG_DEBUG ,(uint8_t *)a)
#define LOGI(a) sys_log(LOG_INFO ,(uint8_t *)a)
#define LOGW(a) sys_log(LOG_WARN ,(uint8_t *)a)
#define LOGE(a) sys_log(LOG_ERR ,(uint8_t *)a)
#define LOGA(a) sys_log(LOG_ASSERT,(uint8_t *)a)
#endif
#include "sys_log.h"
static void (*g_log_calbk)(uint8_t *str, uint32_t len);
static uint8_t g_log_rule;
void bind_log_calbk( void (*log_calbk)(uint8_t *str, uint32_t len))
{
g_log_calbk = log_calbk;
}
void set_log_rule(uint8_t rule)
{
g_log_rule = rule;
}
void sys_log(LOG_LV lv, uint8_t *str)
{
uint32_t len = strlen(str);
if ((lv & g_log_rule) == lv)
{
switch (lv)
{
case LOG_DEBUG:
g_log_calbk((uint8_t *)"\r\n[debug]:", sizeof("\r\n[debug]:"));
break;
case LOG_INFO:
g_log_calbk((uint8_t *)"\r\n[info]:", sizeof("\r\n[info]:"));
break;
case LOG_WARN:
g_log_calbk((uint8_t *)"\r\n[warning]:", sizeof("\r\n[warning]:"));
break;
case LOG_ERR:
g_log_calbk((uint8_t *)"\r\n[error]:", sizeof("\r\n[error]:"));
break;
case LOG_ASSERT:
g_log_calbk((uint8_t *)"\r\n[assert]:", sizeof("\r\n[assert]:"));
break;
default:
g_log_calbk((uint8_t *)"\r\n[debug]:", sizeof("\r\n[debug]:"));
break;
}
g_log_calbk(str,len);
}
else
{
}
}
#include <stdio.h>
#include "sys_log.h"
void printf_calbk(uint8_t *str, uint32_t len)
{
printf("%s",str);
}
int main(void)
{
bind_log_calbk(printf_calbk);
set_log_rule(LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR|LOG_ASSERT);
LOGD("log a debug");
LOGI("log a info");
LOGW("log a warning");
LOGE("log a error");
LOGA("log a assert");
return 0;
}
输出
[debug]:log a debug
[info]:log a info
[warning]:log a warning
[error]:log a error
[assert]:log a assert
|