explorer

万丈高楼平地起,勿在浮沙筑高台

0%

Hello World

  • 新建文件夹并编写代码:
1
2
3
4
5
6
7
8
9
10
11
12
//hello.cpp

#include <iostream>

using namespace std;

int main(void)
{
cout << "Hello world!" << endl;

return 0;
}
阅读全文 »

基本知识

脚本

vim 的设置可以写入脚本文件中来达到批量配置的目的, 在 vim 中使用 :scriptnames 命令查看作用的脚本及其路径.

一般情况下, vim启动脚本路径为 ~/.vimrc (linux) 或 $HOME/_vimrc, $VIM/_vimrc (windows), 其示例文件位于 $VIMRUNTIME/vimrc_example.vim

脚本文件可以包含任何冒号命令, 其注释使用 " 开头.

阅读全文 »

在PC上如果一个代码需要经常调试的话,那么建议为GDB单独开一个窗口然后不退出,这样gdb就可以保持断点等一些设置, 而使用 r 运行时,又会调用最新编译的可执行文件,这样就不用每次重新启动又设置很多配置了。

基础必备知识

gdb完整调试的必备条件

要让gdb能够完整的调试一个程序,必须具备:

  • dwarf(debugging with attributed record formats) : 编译每个源码必须加上 -g 选项以包含 dwarf 信息
  • symbol table : 默认的不加任何参数编译出的可执行文件都带有symbol table
  • source code : 源代码

dwarf 格式中包含了对程序中函数名、变量名等符号的详细描述(比如在源码中的位置,大小,名称等等)。可以使用 dwarfdump <execfile> 来查看其格式。

但 dwarf 中并不包含实际的代码,所以为了让gdb可以跟踪代码,还需要整个源码。 默认情况下源码路径即为编译路径,如果移动了可执行文件位置到别处,需要设置源文件路径

为了明确一个可执行文件中是否含有dwarf和symbol table,可以使用 readelf -S <execfile> 的方式查看是否有对应的段。

其实在嵌入式调试中,即使gdb没有源码,只要有dwarf也可以抓取到很多有用的信息。

需不需要源码需要根据实际情况而定。

在产品出厂时,就不需要 dwarfsymbol table 信息了,这时使用 strip <execfile> 来瘦身。

  • 在嵌入式中使用对应的工具,比如在arm-linux中使用 arm-linux-gnueabihf-strip <execfile>

正式调试前的准备工作

生成带调试信息的可执行文件

在使用 GDB前,需要让编译器 将代码的调试信息包含在可执行文件中 ,以C为例,gcc编译器需要加上 -g 选项:

gcc -g hello.c -o hello

很多时候也会使用CMake来生成,一般在 CMakeLists.txt 文件中加入:

set(CMAKE_BUILD_TYPE Debug)
#或者也可以在入口参数中指定
cmake -DCMAKE_BUILD_TYPE=Debug ....
阅读全文 »

概览

IEEE micro 中定义了 SDR(软件无线电) 通信协议,其基本思想是:

SDR的底层由一个软件引擎总管,其他应用软件(本机软件或者上位机软件)通过一个统一的协议来与引擎通信达到控制底层硬件的目的。

这种构架具有如下优点:

  • 抽象硬件底层,使得应用软件不用关心具体的硬件而独立开发。
  • 开发出的软件理论上是可以兼容所有满足此协议的底层硬件,达到跨平台的目的。
interface.jpg如上图所示,此协议的特点为:
  • 协议包分为控制包,信号包和环境包,
  • 信号包用于传输高速信号,控制包用于控制所有可控的器件,环境包用于返回硬件环境
阅读全文 »

概览

USRP Hardware Driver(UHD) 是由 Ettus Research 公司所提供的开源免费SDR库,使用此库统一的协议(简化了IEEE micro 的协议)来完成与SDR设备的通信。

最终的用户使用库的接口便可以统一抽象设备,此库可以用来单独编写应用程序或者与其他的第三方软件接口。

uhd_struct.jpg

此库具有以下特点:

  1. 抽象SDR硬件设备
  2. 支持设备和主机,设备和设备之间的双向通信
  3. 通信协议以流的形式传输以包的形式来分隔
阅读全文 »