可应用与嵌入式的操作系统有Linux、VxWorks等,VxWorks的调试较简单,因为没有虚拟内存的限制,所以支持直接修改内存数据,且支持符号表,因此在shell中可以直接数据全局函数或变量进行运行调试。
Linux有虚拟内存,且不能够直接运行全局函数或全局变量赋值,因此在调试阶段不方便,本文提供一种Linux的调试方法,并附测试源码,该源码可添加进应用程序中进行调试使用,改源码对外提供接口函数,包含相应的.h文件则可以直接调用接口,使用较简单。
Linux系统应用程序在开发阶段,在涉及到协议解析时经常需要打印接收、发送、或中间过程数据,不可能每修改一次进行编译烧写测试,这样效率较低,因此可以使用全局变量控制打印开关,从而控制打印的方法,但是Linux不像VxWorks支持直接修改全局变量,因此需要一种修改全局变量的方法,如下提供几种方法:
1)scanf函数
应用程序中编写一个线程主要使用scanf接收终端写入的数据,从而修改全局变量达到控制打印开关的目的。
优点:实现简单,可以应用于Linux嵌入式板卡,使用一个串口即可进行调试;
缺点:与应用程序使用同一个终端,打印较乱。
2)共享内存
进程间通信共享内存的方式修改全局变量。
3)配置文件
读取配置文件控制打印开关
4)socket方式
提到的socket方式有两种,一种为本地socket,一种为使用TCP协议的不在同一个主机的socket。
本地socket通信,可以部署在同一个单板上,需要开启两个终端,一个终端启动debug进程,该进程负责发送控制变量,另一个终端启动应用程序进程,该进程包含调试线程,该线程负责接收发送进程的控制数据,实现开关的控制。部署如图所示
图1 本地socket通信调试
使用TCP协议通信可以实现使用主机调试单板,在主机虚拟机部署debug进程,嵌入式单板程序中包含debug线程,该线程负责接收发送进程的控制数据,实现开关的控制。部署如图所示
图2 主机调试嵌入式单板
1)如图1调试方式,则程序配置方式如下:
debug_ctl文件夹为调试发送进程,需要根据不同部署进行配置。
#define TCP_CONNECT //不需要定义
#define CLIENT_LOCAL_COMM_PATH "/home/debug_sock_path"
work_space文件夹debug_ctl.c文件中定义
#define TCP_CONNECT //不需要定义
#define SERVER_LOCAL_COMM_PATH "/home/debug_sock_path"
2)如图2调试方式,则程序配置方式如下:
debug_ctl文件夹为调试发送进程,需要根据不同部署进行配置。
#define TCP_CONNECT //对TCP_CONNECT进行宏定义
宏定义IP地址和端口号
#define TARGET_IP ("127.0.0.1")
#define PORT (5678);
work_space文件夹debug_ctl.c文件中定义
#define TCP_CONNECT //对TCP_CONNECT进行宏定义
宏定义IP地址和端口号
#define PORT (5678);
应用程序运行后,等待debug进程运行,该进程参数为-31~+31;
已经提前使用的变量
-1:打开所有的开关;
0:关闭所有的开关;
1:打印开关帮助;
2 ~ 31 为打开开关;
-2 ~ -31关闭相应的开关。
1.int debug_ctl_init( void )
函数功能:
该函数初始一个debug线程,该线程为服务器端,负责接收控制开关
2.get_switch_status( unsigned int temp )
函数功能:
该函数获取特定位是否为1,从而控制开关。
参数unsigned int temp
打印开关控制变量。
示例:
if(get_switch_status( 1 << 12 ))
{
printf("1<<12\r\n");
}
判断变量1左移12位是否为1,若为1则输出打印。
资源:
https://download.csdn.net/download/jianzhao6205/86395109