使用GNU EMACS开发Linux用户空间C程序
配置GNU EMACS
package-install RET eglot RET
package-isntall RET company RET
在GNU EMACS初始化脚本中加入
(add-hook 'c-mode-hook 'eglot-ensure) ;; 在C模式自动开启eglot
(add-hook 'c-mode-hook 'company-mode) ;; 在C模式自动开启company
编写Makefile
CROSS_COMPILE ?= arch-vendor-
CC = $(CROSS_COMPILE)gcc
CFLAGS += -Wall -Wextra -O3 -g3
CFLAGS += -march=xxx -mabi=xxx
all:
$(CC) $(CFLAGS) hello.c -o hello
clean:
rm -fv *.out hello
编写.clangd
由于clangd使用主机的c编译器来处理传入的C源码文件,所以需要clangd忽略机器相关的编译器参数:
CompileFlags:
Add: -Wno-unknown-warning-option
Remove: [-m*, -f*]
生成 compile_commands.json
make clean
bear -- make all
编写程序
emacs hello.c
输入代码前面的字符就可以看到补全
上传到板子
scp hello xxx@board:/tmp/hello
调试
使用printf调试
在程序里面打日志作为调试手段
远程调试
远程板子因为资源限制通常不会提供完整的gdb用来调试,通常会安装一个gdbserver充当agent,供别的机器远程上去调试。
因为嵌入式开发的目标板子和运行GNU EMACS的PC机架构不一样,所以在运行GNU EMACS的机器上需要安装一个支持多个架构的gdb-multiarch:
https://aur.archlinux.org/packages/gdb-multiarch
在板子上运行:
gdbserver 0.0.0.0:1234 /tmp/hello
注意:不同发行版的gdb-multiarch命名可能会不一样:
ArchLinux:
https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=gdb-multiarch#n50
Fedora:
dnf install gdb安装的gdb默认开启了multiarch
在GNU EMACS中运行:
gud-gdb RET 删除原有gdb命令,然后输入gdb-multiarch,回车
set architecture arch
target remote ip:1234
之后就可以使用gdb进行调试了