Ronan Blog

罗华东的博客 | 向前每多走一步,热爱和勇气就会多一分。

sdcc编译与链接

2024-09-02 1 min read Docs Ronan

1.编译源文件

首先,你需要编译你的源文件(例如 main.c)以生成目标文件(.rel)。你可以使用以下命令:

sdcc -c main.c

这条命令会生成 main.rel 文件。

如果你的库文件不在当前目录下并且提示头文件未找到,你可以通过 -I 选项指定包含文件的路径,然后使用绝对路径指定库,例如:

sdcc  -I/path/to/include -c /path/to/src/main.c 

这条命令也会生成 main.rel 文件。

如果不希望生成的目录挤在和main.c相同目录下,可以通过-o参数指定

sdcc -c main.c -o /path/to/build

2.编译其他库文件

假设你有其他的库文件(例如 library.c),你需要同样地将它们编译成目标文件:

sdcc -c library.c

这条命令会生成 library.rel 文件。

你需要编译的库文件是以 .lib 或者 .a 结尾的,你可以在编译命令中指定这些库文件。

如果你的库文件不在当前目录下并且提示头文件未找到,你可以通过 -I 选项指定包含文件的路径,然后使用绝对路径指定库,例如:

sdcc  -I/path/to/include -c /path/to/lib/library.c

这条命令也会生成 library.rel 文件。

如果不希望生成的目录挤在和main.c相同目录下,可以通过-o参数指定

sdcc -c library.c -o /path/to/build

3.链接所有目标文件

一旦你有了所有的目标文件,你就可以将它们链接起来生成最终的二进制文件。你可以使用以下命令:

sdcc main.rel library.rel

这条命令会生成一个可执行文件(例如 a.out 或者具体取决于你编译的目标平台)。

例如,生成.hex文件:

sdcc -o out.hex main.rel library.rel

综合实例

假设你的项目结构如下:

Continue reading

「macOS」neovide初始化错误、常见问题

2024-09-02 1 min read Docs Ronan

在 M1 macOS 中下载 neovide 之后打开遇到:

error

原因分析

由于现在所有的 macOS 版本内置终端都是默认使用 zsh ,但是 Neovide 不会在交互式 shell 中启动嵌入式 neovim 实例,因此 shell 不会读取其启动文件的一部分( ~/.bashrc ~/.zshrc 无论你的 shell 的等效项是什么)。

解决方法

1.首先找到当前安装的 neovim 路径,通过 which nvim 查看,例如

❯ which nvim

/opt/homebrew/bin/nvim

/opt/homebrew/bin/nvim 就是 nvim 的路径,记住它!!!

2.根据自己的 shell,例如:

  • 对于 zsh,将 export PATH="/opt/homebrew/bin:$PATH" 放入 ~/.zprofile~/.zlogin 中。
  • 对于 bash,将 export PATH="/opt/homebrew/bin:$PATH" 放入 ~/.profile

个人自用 stm32 工程模板程序

2024-09-02 2 min read Docs Ronan

注意文件位置:/Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0

#!/usr/bin/env bash

# 检查是否提供了工程名参数
if [ -z "$1" ]; then
    echo "使用方法: $0 <工程名>"
    exit 1
fi

# 获取工程名
project_name=$1

# 创建工程根目录
if [ ! -d "$project_name" ]; then
    mkdir "$project_name"
else
    echo "根目录已存在: $project_name"
fi

# 创建子目录
for dir in src lib include cmsis; do
    if [ ! -d "$project_name/$dir" ]; then
        mkdir "$project_name/$dir"
    else
        echo "子目录已存在: $project_name/$dir"
    fi
done

#cmsis
cp -r /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Libraries/CMSIS/Include ${project_name}/cmsis/
cp -r /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO ${project_name}/cmsis/

#lib
cp -r /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Libraries/STM32F4xx_StdPeriph_Driver/inc ${project_name}/lib/
cp -r /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Libraries/STM32F4xx_StdPeriph_Driver/src ${project_name}/lib/

#include
cp /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h ${project_name}/include/
cp /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h ${project_name}/include/
cp /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Project/STM32F4xx_StdPeriph_Templates/stm32f4xx_conf.h ${project_name}/include/
cp /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Project/STM32F4xx_StdPeriph_Templates/stm32f4xx_it.h ${project_name}/include/

#src
cp /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Project/STM32F4xx_StdPeriph_Templates/stm32f4xx_it.c ${project_name}/src/
cp /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Project/STM32F4xx_StdPeriph_Templates/system_stm32f4xx.c ${project_name}/src/

cp /Users/iaa/bin/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM32F40_41xxx/STM32F417IG_FLASH.ld ${project_name}
mv ${project_name}/STM32F417IG_FLASH.ld ${project_name}/stm32_flash.ld


# 创建Makefile文件
if [ ! -e "${project_name}/Makefile" ]; then
    mkdir -p "${project_name}"
    cat > "${project_name}/Makefile" << EOF
CROSS_COMPILE = arm-none-eabi-

# 将源文件放在这里 (*.c)
SRCDIR=./src
LIBDIR=./lib/src

SRC = \$(wildcard \${LIBDIR}/*.c) \\
      \$(wildcard \${SRCDIR}/*.c)

# 将以该名称生成二进制文件 (.elf, .bin, .hex)
PROJECT_NAME=out

# 编译器设置。仅编辑 CFLAGS 以包含其他头文件。
CC = \$(CROSS_COMPILE)gcc
AS = \$(CROSS_COMPILE)as
LD = \$(CROSS_COMPILE)gcc
OBJCOPY = \$(CROSS_COMPILE)objcopy

# compiler flags 编译器标志
CFLAGS = -g -O2 -Wall -Tstm32_flash.ld
CFLAGS += -DUSE_STDPERIPH_DRIVER
CFLAGS += -D STM32F40_41xxx
CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CFLAGS += -I .
CFLAGS += -specs=nosys.specs

# 包含 STM 库中的文件
CFLAGS += -I./cmsis/Include
CFLAGS += -I./include
CFLAGS += -I./lib/inc

SRC += ./cmsis/TrueSTUDIO/startup_stm32f40_41xxx.s

# 将 SRC 中每个 .c 文件的扩展名替换为 .o,生成对应的目标文件。
OBJS = \$(SRC:.c=.o)

vpath %.c ./lib/src
vpath %.c ./src

.PHONY: proj

all: proj

proj: \$(PROJECT_NAME).elf

\$(PROJECT_NAME).elf: \$(SRC)
	\$(CC) \$(CFLAGS) \$^ -o \$@
	\$(OBJCOPY) -O ihex \$(PROJECT_NAME).elf \$(PROJECT_NAME).hex
	\$(OBJCOPY) -O binary \$(PROJECT_NAME).elf \$(PROJECT_NAME).bin

clean:
	rm -f *.o \$(PROJECT_NAME).elf \$(PROJECT_NAME).hex \$(PROJECT_NAME).bin

flash: proj
	STM32_Programmer_CLI -c port=SWD -w \$(PROJECT_NAME).hex
EOF

    echo "Makefile 已生成在: ${project_name}/Makefile"
else
    echo "Makefile 已存在: ${project_name}/Makefile"
fi


# 创建 main.c
if [ ! -e "${project_name}/src/main.c" ];then
    cat > "${project_name}/src/main.c" << EOF
#include<stm32f4xx.h>

int main(void)
{
    while(1);
}
EOF
    echo "main.c 已生成在:${project_name}/src/main.c"
else
    echo "main.c 已存在"
fi


# 创建
if [ ! -e "${project_name}/src/syscalls.c" ];then
    cat > "${project_name}/src/syscalls.c" << EOF
#include <sys/types.h>  // 包含必要的类型定义

int _close(int file) {
    return -1;
}

int _lseek(int file, int ptr, int dir) {
    return -1;
}

int _read(int file, char *ptr, int len) {
    return 0;
}

int _write(int file, char *ptr, int len) {
    return len;
}

caddr_t _sbrk(int incr) {
    extern char _end;  // 链接器脚本中定义的堆的起始位置
    static char *heap_end;
    char *prev_heap_end;

    if (heap_end == 0) {
        heap_end = &_end;
    }

    prev_heap_end = heap_end;
    heap_end += incr;

    return (caddr_t)prev_heap_end;
}
EOF
fi

rm -f ${project_name}/lib/src/stm32f4xx_fmc.c

# 注释掉 stm32f4xx_it.c 中的 #include "main.h" 和 TimingDelay_Decrement();
sed -i '' 's|#include "main.h"|//&|' "${project_name}/src/stm32f4xx_it.c"
sed -i '' 's|TimingDelay_Decrement();|//&|' "${project_name}/src/stm32f4xx_it.c"

echo "${project_name}创建成功"
Older posts Newer posts