嵌入式系统不是通用的计算机系统,其板上资源通常受到限制。大部分嵌入式系统没有大容量存储设备和高性能CPU,体积、功耗、重量等也决定了不可能在嵌入式系统上直接安装发行版Linux系统,也不能直接在嵌入式系统硬件平台上编写软件。目前的解决方法是采用交叉开发模型。由于C语言不管是在内核空间还是在用户空间都是嵌入式开发的基础,故以C语言为例进行介绍。
GNU/Linux操作系统,有上百种发行版。比较流行的有Ubuntu, Fedora, Redhat等。
命令 | 功能 |
---|---|
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 hello ,file 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来自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
表示当前目录下的指定文件】
GNU提供的一个“编译管理器”,通过读入makefile文件的内容批量执行编译工作,并且能够通过判断文件的时间戳来确定更新过的文件,从而大大减少编译的工作量。
新建名为 makefile
的文档,编写格式为:
target: dependency command
例:利用 makefile 编译、链接多个项目文件
#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; }
#ifndef __SUB_H__ #define __SUB_H__ int func_sum(int); #endif
int func_sum(int n) { int sum = 0, i; for( i = 0; i <= n; i++ ) { sum += i; } return sum; }
完整写法:
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 即可):
sumf: exm.o exf.o gcc *.o -o $@ %.o : %.c gcc -c $? clean: rm -f *.o sumf
优化写法2(增加新模块,仅第一行后面增加 xx.c 即可):
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文件 |
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 |
#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; }
在Linux环境下编译链接生成可以在arm目标板执行的程序。
使用方法:
终端执行 arm-linux-gcc <options> <filename>
通过超级终端 hypertrm 将程序发送至目标板。
显示方法:
超级终端执行 ./filename
makefile写法:
CC = arm-linux-gcc TARGET = sumf all : $(TARGET) $(TARGET) : exm.c exf.c $(CC) $? -o $@ clean : rm -f *.o $(TARGET)