目录

Linux环境下的程序设计

嵌入式系统不是通用的计算机系统,其板上资源通常受到限制。大部分嵌入式系统没有大容量存储设备和高性能CPU,体积、功耗、重量等也决定了不可能在嵌入式系统上直接安装发行版Linux系统,也不能直接在嵌入式系统硬件平台上编写软件。目前的解决方法是采用交叉开发模型。由于C语言不管是在内核空间还是在用户空间都是嵌入式开发的基础,故以C语言为例进行介绍。


交叉开发模型


Linux操作系统

GNU/Linux操作系统,有上百种发行版。比较流行的有Ubuntu, Fedora, Redhat等。


常用Linux命令

命令 功能
man 帮助命令,如 man ls
ls 查看当前或指定路径目录,常用可选参数 -a-l
cd 修改文件路径,如 cd ~cd ..cd /usr/bin
mv 移动文件,如 mv test /mnt;重命名,如 mv source target
cp 复制文件,如 cp source target
mkdir 创建文件目录,如 mkdir -p h/h.c,可选参数 -p,确保目录存在
rm 删除指定文件,递归删除rm -r,强制删除rm -f
rmdir 删除当前目录下的子目录
pwd 显示当前目录(路径)
chmod 设置文件操作权限,如,可读可写可执行 chmod 777 filename
touch 创建新文件,如 touch test.c
命令 功能
gedit 若已安装,可打开gedit编辑器,如 gedit ex.c
subl 若已安装,可打开subl编辑器,如 subl ex.c
file 检查二进制文件,如 file hellofile hello-arm
cat 显示文件的内容,如 cat file
top 查看系统信息
sleep 系统挂起,如,挂起9秒 sleep 9
reboot 重启系统
ping 网络命令,测试网络连通性,如 ping 192.168.1.230
ifconfig 查看/设置网卡
telnet 若已安装,可远程登陆服务器,如 telnet 192.168.1.230

gcc编译工具

gcc来自GNU C Compiler的缩写,不仅支持C语言,还支持C++、Java、Pascal等其他语言。

使用方法:
终端执行 gcc <options> <filenames>

可选参数 功能
-c .c 源代码编译成 .o 文件,不进行链接,如 gcc ex.c -c
-o .c 源代码编译并链接生成可执行文件,如 gcc ex.c -o ex

显示结果:
终端执行 ./filename
./filename 表示当前目录下的指定文件】

hello.c
#include<stdio.h>
 
int main()
{
	printf("Hello Hello Hello!\n");
	return 0;
}

makefile的编写

GNU提供的一个“编译管理器”,通过读入makefile文件的内容批量执行编译工作,并且能够通过判断文件的时间戳来确定更新过的文件,从而大大减少编译的工作量。

新建名为 makefile 的文档,编写格式为:

target: dependency
	command

例:利用 makefile 编译、链接多个项目文件

exm.c
#include<stdio.h>
#include "exf.h"
 
int main()
{
	int i;
	int sum_result = 0;
	sum_result = func_sum(100);
	printf("\nThe sum of 1~100 is %d\n", sum_result);
 
	sum_result = func_sum(200);
	printf("The sum of 1~200 is %d\n\n", sum_result);
 
	return 0;
}
exf.h
#ifndef __SUB_H__
#define __SUB_H__
 
int func_sum(int);
 
#endif
exf.c
int func_sum(int n)
{
	int sum = 0, i;
	for( i = 0; i <= n; i++ )
	{
		sum += i;
	}
	return sum;
}

完整写法:

makefile
sumf: exm.o exf.o
	gcc exm.o exf.o -o sumf
 
exm.o: exm.c
	gcc -c exm.c
exf.o: exf.c
	gcc -c exf.c
 
clean:
	rm -f *.o sumf

优化写法1(增加新模块,仅第一行后面增加 xx.o 即可):

makefile
sumf: exm.o exf.o
	gcc *.o -o $@
 
%.o : %.c
	gcc -c $?
 
clean:
	rm -f *.o sumf

优化写法2(增加新模块,仅第一行后面增加 xx.c 即可):

makefile
CC	= gcc
TARGET	= sumf
 
all : $(TARGET)
 
$(TARGET) : exm.c exf.c
	$(CC)  $? -o $@
 
clean :
	rm -f *.o $(TARGET)

使用方法:
终端执行:make
终端删除:make clean

makefile中常用的自动变量

命令 含义
$* 不包含扩展名的目标文件名称
$+ 所有依赖文件,以空格分开,以出现先后顺序排序
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件,以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
%.o : %.c 所以.c文件编译产生.o文件

gdb调试工具

GNU发布,能够进入被调试程序的内部,检查调试程序的逻辑错误。根据被调试程序的语言设置自己的调试语言环境。若未安装,可先用 dnf install gdb 指令进行安装。

使用方法:

命令 功能
gcc -g ex.c -o ex 产生 gdb 所需符号信息
gdb ex 启动 gdb
l 分块列出源代码
break N 在源程序第 N 行设置断点
break info 显示设置的断点信息
r 执行 run 命令,运行程序
n 单步执行下一行
p i 打印变量 i 的值
c 继续执行程序
bt 查看堆栈(函数调用情况)
q 退出 gdb
sumf.c
#include<stdio.h>
 
int func_sum(int n)
{
	int sum = 0, i;
	for( i = 0; i <= n; i++ )
	{
		sum += i;
	}
	return sum;
}
 
int main()
{
	int i;
	int sum_result = 0;
	sum_result = func_sum(100);
	printf("\nThe sum of 1~100 is %d\n", sum_result);
 
	sum_result = func_sum(200);
	printf("The sum of 1~200 is %d\n\n", sum_result);
 
	return 0;
}

arm-linux-gcc交叉编译工具

在Linux环境下编译链接生成可以在arm目标板执行的程序。

使用方法:
终端执行 arm-linux-gcc <options> <filename>

通过超级终端 hypertrm 将程序发送至目标板。
显示方法:
超级终端执行 ./filename

makefile写法:

makefile
CC	= arm-linux-gcc
TARGET	= sumf
 
all : $(TARGET)
 
$(TARGET) : exm.c exf.c
	$(CC)  $? -o $@
 
clean :
	rm -f *.o $(TARGET)

接线方式