解读《ARM Cortex-M3 与Cortex-M4 权威指南》——第2章 嵌入式软件开发简介

时间:2024-10-17 10:22:56

1.ARM微控制器的组成

在这里插入图片描述
**

2.软件开发流程

**
在这里插入图片描述
创建工程->添加文件到工程->设置工程选项->编译和链接->编程Flash->测试并调试
在这里插入图片描述
在这里插入图片描述

Keil 实际上是一款集成开发环境(IDE),但是它也包含了一个完整的工具链,用于嵌入式系统的开发。具体来说,Keil MDK(Microcontroller Development Kit)包括以下组件:
1、编译器:
Keil 提供了 ARM 编译器(如 ARMCC 和 ARMCLANG),用于将 C/C++ 代码编译为机器代码。
2、汇编器:
将汇编语言代码转换为机器代码的工具。
3、链接器:
合并多个目标文件生成最终的可执行文件。
4、调试器:
提供强大的调试功能,包括单步执行、断点设置和变量监控等。
5、库:
提供了丰富的标准库和外设驱动库,简化开发过程。

在嵌入式软件开发中,使用开源工具链如GCC、LLVM等时,确实可能没有集成开发环境(IDE),而需要依赖脚本或Makefile来管理编译和链接过程。下面是一个关于如何使用这些工具的概述。

开源工具链中的开发流程

1. 工具链安装

  • 安装所需的开源工具链,如GCC for ARM、GNU Binutils等。
  • 确保安装相关的调试工具,如GDB(GNU Debugger)。

2. 项目结构

  • 创建一个文件夹结构,通常包括:
    • src/:源代码文件
    • include/:头文件
    • build/:编译生成的中间文件和最终可执行文件目录
    • Makefile:构建脚本

3. Makefile 示例

# 定义变量
CC = arm-none-eabi-gcc
CFLAGS = -mcpu=cortex-m4 -mthumb -g
SRC = $(wildcard src/*.c)
OBJ = $(SRC:src/%.c=build/%.o)
TARGET = build/my_program.elf

# 默认目标
all: $(TARGET)

# 链接目标
$(TARGET): $(OBJ)
	$(CC) -o $@ $^

# 编译每个源文件为目标文件
build/%.o: src/%.c
	@mkdir -p build
	$(CC) $(CFLAGS) -c $< -o $@

# 清理生成的文件
clean:
	rm -rf build/*.o $(TARGET)

# 伪目标
.PHONY: all clean

4. 编译与链接

  • 使用命令行进入项目目录,运行 make 命令以执行Makefile,完成编译和链接。
  • 生成的可执行文件通常为 ELF 格式,可以通过相应的工具进行烧录或下载到嵌入式设备中。
  1. 调试
    • 使用GDB进行调试,通常可以通过以下步骤进行:
      • 启动GDB并加载程序:
        arm-none-eabi-gdb build/my_program.elf
        
      • 连接到调试器(如ST-Link、J-Link):
        target remote :1234  # 根据使用的调试器调整端口
        

6. 自动化与脚本

  • 可以通过编写Shell脚本来自动化编译、链接和下载过程。例如,可以创建一个 build.sh 脚本:
#!/bin/bash
make
arm-none-eabi-gdb build/my_program.elf -ex "target remote :1234"

总结
使用开源工具链进行嵌入式开发时,尽管没有传统的IDE,依然可以通过Makefile和脚本实现高效的编译和调试流程。这种方法提供了灵活性和可定制性,适合于对开发环境有特殊需求的项目。

Makefile

Makefile 是一种用于自动化构建和管理程序的文件,通常与 make 工具一起使用。它定义了一组规则,指示如何从源代码生成可执行文件或其他目标文件。Makefile 可以简化编译过程,尤其是在大型项目中,确保只重新编译那些发生更改的文件。

基本组成部分

  1. 变量:可以定义变量来存储编译器名称、编译选项等。

    CC = gcc
    CFLAGS = -Wall -g
    
  2. 目标:Makefile 的基本结构由目标、依赖关系和命令组成。

    target: dependencies
        command
    
  3. 规则:描述如何生成目标文件。例如:

    my_program: main.o utils.o
        $(CC) -o my_program main.o utils.o
    
  4. 伪目标:不对应于实际文件的目标,如 clean,用于清理构建生成的文件。

    clean:
        rm -f *.o my_program
    

示例

以下是一个简单的 Makefile 示例:

# 定义变量
CC = gcc
CFLAGS = -Wall -g

# 源文件和目标
SRC = main.c utils.c
OBJ = $(SRC:.c=.o)
TARGET = my_program

# 默认目标
all: $(TARGET)

# 链接目标
$(TARGET): $(OBJ)
	$(CC) -o $@ $^

# 编译每个源文件
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

# 清理目标
clean:
	rm -f $(OBJ) $(TARGET)

# 伪目标
.PHONY: all clean

使用方法

  1. 在终端中进入包含 Makefile 的目录。
  2. 运行命令 make 来构建项目。默认会构建第一个目标。
  3. 使用 make clean 来删除生成的文件。

总结

Makefile 是一个强大的工具,用于管理软件构建过程,简化了编译和链接步骤,特别适合大型项目和多文件项目。它通过定义规则和依赖关系,帮助开发者高效地管理代码的构建。

GCC(GNU Compiler Collection)

  1. 概述

    • GCC 是一个开源的编译器集合,最初由 GNU 项目开发。它支持多种编程语言,包括 C、C++、Fortran、Ada 和 Go 等。
  2. 特点