嵌入式系统程序的调试

ubuntu下GDB调试

GDB简介:GNU Debugger,是GNU工程为GNU操作系统开发的调试器,但它的使用不局限于GNU操作系统,GDB可以运行在UNIX、Linux甚至Microsoft Windows。GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编写的程序;被调试的程序可以跟GDB运行于同一台电脑,也可运行于不同电脑。
GDB基本功能
设置断点使程序停住
监视或修改程序中变量的值
跟踪代码执行过程
GDB命令
file——装入想要调试的可执行文件。
kill——终止正在调试的程序。
list——列出产生执行文件的源代码的一部分。
next——执行一行源代码但不进入函数内部。
step——执行一行源代码而且进入函数内部。
run——执行当前被调试的程序。
c——继续运行程序。
quit——终止gdb。
watch——使你能监视一个变量的值而不管它何时被改变。
backtrace——栈跟踪,查出代码被谁调用。
print——查看变量的值。
make——使你能不退出gdb就可以重新产生可执行文件。
shell——使你能不离开gdb就执行UNIX shell命令。
whatis——显示变量或函数类型。
break——在代码里设断点,这将使程序执行到这里时被挂起。
info break——显示当前断点清单,包括到达断点处的次数等。
info files——显示被调试文件的详细信息。
info func——显示所有的函数名称。
info local——显示当函数中的局部变量信息。
info prog——显示被调试程序的执行状态。
delete [n]——删除第n个断点。
disable[n]——关闭第n个断点。
enable[n]——开启第n个断点。
ptype——显示结构定义。
set variable——设置变量的值。
call name(args)——调用并执行名为name,参数为args的函数。
Finish——终止当前函数并输出返回值。
return value——停止当前函数并返回value给调用者。
GDB的使用
下面的代码实现对一个整型数的反转功能,比如输入123,则输出321。创建main.c文件写入以下代码。

#include <stdio.h>
void ShowRevertNum(int iNum)
{
	while (iNum > 10)
	{
	printf("%d",iNum % 10);iNum = iNum/ 10;
	}
	printf("%d\n",iNum);
}
int main(void)
{
int iNum;
printf("Please input a number:");
scanf("%d",&iNum);
printf("After revert : ");
ShowRevertNum(iNum);
}

首先我们要将main.c文件增加可调式信息,用以下代码

gcc-o main -g main.c

在这里插入图片描述

输入gdb进入gdb模式
在这里插入图片描述
在gdb模式下输入l显示代码
在这里插入图片描述
list显示主程序
在这里插入图片描述

通过行数建立断点

在这里插入图片描述
通过函数名建立断点
在这里插入图片描述
查看所有断点信息
在这里插入图片描述
执行程序
在这里插入图片描述
查看iNum类型
在这里插入图片描述
查看iNum的值
在这里插入图片描述
继续执行
在这里插入图片描述
打印iNum值
在这里插入图片描述
单步执行
在这里插入图片描述

Opencv3.x的基本应用

安装及其配置

下载链接
在这里插入图片描述
下载后将文件复制到Ubuntu的home目录下
在这里插入图片描述
解压该文件

unzip opencv-3.4.1.zip      //解压该文件

在这里插入图片描述
进入到解压文件中,输入

sudo apt-get update

在这里插入图片描述
安装依赖库和cmake

sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev  

在这里插入图片描述
在这里插入图片描述
== 安装中出现无法定位软件包 libjasper-dev的问题,我们可以用以下代码解决==

 sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"

创建编译文件夹,并进入文件夹进行配置
创建文件

mkdir my_build_dir                                                     

在这里插入图片描述
进入文件

cd my_build_dir

在这里插入图片描述
cmake

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

在这里插入图片描述

执行命令

sudo make

漫长等待
在这里插入图片描述
下载完成
在这里插入图片描述
然后输入以下命令

sudo make install
sudo gedit /etc/ld.so.conf.d/opencv.conf 

在这里插入图片描述
添加 /usr/local/lib
在这里插入图片描述
保存回到命令行界面
继续执行一下命令使配置生效

sudo ldconfig                                  
sudo gedit /etc/bash.bashrc        

在这里插入图片描述

在这里插入图片描述
保存关闭,继续执行命令:

source /etc/bash.bashrc 
sudo updatedb  

在这里插入图片描述
配置完成

编写一个打开图片进行特效显示的代码 test1.cpp

在opencv-3.4.1下创建test.cpp

#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
	CvPoint center;
        double scale = -3; 

	IplImage* image = cvLoadImage("lena.jpg");
	argc == 2? cvLoadImage(argv[1]) : 0;
	
	cvShowImage("Image", image);
	
	
	if (!image) return -1; 	center = cvPoint(image->width / 2, image->height / 2);
	for (int i = 0;i<image->height;i++)
		for (int j = 0;j<image->width;j++) {
			double dx = (double)(j - center.x) / center.x;
			double dy = (double)(i - center.y) / center.y;
			double weight = exp((dx*dx + dy*dy)*scale);
			uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
			ptr[0] = cvRound(ptr[0] * weight);
			ptr[1] = cvRound(ptr[1] * weight);
			ptr[2] = cvRound(ptr[2] * weight);
		}

	Mat src;Mat dst;
	src = cvarrToMat(image);
	cv::imwrite("test.png", src);

    cvNamedWindow("test",1);  	imshow("test", src);
	 cvWaitKey();
	 return 0;
}

在这里插入图片描述
在这里插入图片描述
在网上下载一张图片,复制到当前目录,名字改为lena.jpg
在这里插入图片描述
在该目录输入命令

g++ test.cpp -o test `pkg-config --cflags --libs opencv`        //创建可执行文件
./test                                                          //运行

在这里插入图片描述
这就简单的实现了图像的处理

练习使用opencv库编写打开摄像头压缩视频的程序

在opencv-3.4.1下创建一个文件夹zuoye1,把以下代码保存为test1.cpp

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
  VideoCapture capture(0);
  while(1)
  {
     Mat frame;
     capture >> frame; 
     imshow("读取视频帧",frame);
     waitKey(30);
   }
     system("pause");
     return 0;
}

在这里插入图片描述
在这里插入图片描述
然后输入

g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`   //创建可执行文件
./test1                                                      //执行文件

在这里插入图片描述
出现错误,这是由于Ubuntu没有与主机摄像头建立联系
在这里插入图片描述
可以再上图中建立连接,如果还是失败将2.0改为3.0,或者3.0改为2.0
在这里插入图片描述
成功打开摄像头
在这里插入图片描述
用这个代码来播放一个视频,先任意复制一个视频到当前目录下

在这里插入图片描述
双击无法播放,先安装插件
在这里插入图片描述
使用命令安装

sudo apt install ubuntu-restricted-extras

在这里插入图片描述
用tab键换行敲回车
在这里插入图片描述

在test.cpp中将下面程序替换源程序

VideoCapture capture("123.mp4");         //括号里面123.mp4是视频文件名字 

再次创建可执行程序

g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`
./test

在这里插入图片描述
就可以完成视频的显示了
1.然后在这个代码中Mat是一个类。由两部分数据组成:矩阵头(包括矩阵尺寸、存储方法、存储地址等信息)和一个指向所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针。
2.然后waitkey这个命令控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像,就只有一个空窗口一闪而过,所以必须加waitkey。
3.打开摄像头的代码,窗口只能用Ctrl+c退出,可以改成如下,就可以用ESC退出了

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
  VideoCapture capture(0);
  int key;
  while(1)
  {
     Mat frame;
     capture >> frame; 
     key = waitKey(100);
      if (key == 27)
	{
		break;
	}

     imshow("读取视频帧",frame);
     waitKey(30);
   }
     system("pause");
     return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值