瑞萨 Writing to the on-chip debug reserved area is prohibited.(address: 0x00000002)(E1203124) 的问题解决

本文介绍了Markdown编辑器的新功能与基本语法。编辑器有全新界面设计、图片拖拽等新功能,还支持KaTeX数学公式、甘特图等。同时讲解了功能快捷键、标题创建、文本样式改变、代码片插入等基本语法,以及导出与导入文件的操作。

@[TOC](这里写自![在这里插入图片描述](https://img-blog.csdnimg.cn/20190321193448507.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMzU4MjYw,size_16,color_FFFFFF,t_70)定义目录标题)

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

Building target: slave.elf C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: ./src/hal_entry.o: in function `hal_entry': E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:16:(.text.hal_entry+0x4): undefined reference to `R_BSP_SystemInit' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:19:(.text.hal_entry+0x8): undefined reference to `R_BSP_TimeInit' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:25:(.text.hal_entry+0x1e): undefined reference to `R_BSP_MillisecondsGet' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:41:(.text.hal_entry+0x2a): undefined reference to `R_BSP_MillisecondsGet' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/hal_entry.c:35:(.text.hal_entry+0x42): undefined reference to `R_BSP_MillisecondsGet' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: ./src/nrf24_slave.o: in function `nrf24_slave_is_connected': E:\Ebedded\sur\slave\Debug/../src/nrf24_slave.c:158:(.text.nrf24_slave_is_connected+0x10): undefined reference to `R_BSP_MillisecondsGet' C:/Program Files (x86)/Arm GNU Toolchain arm-none-eabi/13.2 Rel1/bin/../lib/gcc/arm-none-eabi/13.2.1/../../../../arm-none-eabi/bin/ld.exe: E:\Ebedded\sur\slave\Debug/../src/nrf24_slave.c:160:(.text.nrf24_slave_is_connected+0x24): undefined reference to `R_BSP_MillisecondsGet' collect2.exe: error: ld returned 1 exit status make: *** [makefile:96: slave.elf] Error 1
最新发布
07-18
<think>我们正在处理一个嵌入式ARM项目的链接错误,错误信息是未定义的引用,指向三个函数:`R_BSP_SystemInit`, `R_BSP_TimeInit` 和 `R_BSP_MillisecondsGet`。这些函数属于瑞萨电子的FSP(Flexible Software Package)库。根据之前的上下文,我们知道`R_BSP_MillisecondsGet`定义在`r_bsp.c`文件中,那么其他两个函数很可能也在同一个或相关的文件中。 解决链接错误的一般步骤: 1. 确保包含这些函数定义的源文件被编译并链接到项目中。 2. 检查链接器是否能够找到包含这些函数的目标文件或库。 3. 确保没有遗漏必要的库文件。 具体到FSP: - FSP库中的函数通常在`src`目录下的各个文件中定义。例如,`R_BSP_SystemInit`和`R_BSP_TimeInit`可能也在`r_bsp.c`中,或者在其他文件中。 - 在FSP中,这些函数属于BSP(板级支持包)模块。 因此,我们需要: 1. 确认项目中是否包含了`r_bsp.c`文件(以及可能需要的其他文件)的编译。 2. 检查项目配置中FSP库的路径是否正确设置,确保编译器能够找到头文件和源文件。 根据FSP的结构,这些函数可能的位置: - `R_BSP_SystemInit`: 可能在`r_bsp.c`中,负责初始化系统时钟、内存等。 - `R_BSP_TimeInit`: 可能在`r_bsp.c`中,初始化时间相关的硬件(如定时器)。 然而,由于用户遇到了链接错误,很可能是因为这些源文件没有被正确链接。 解决步骤: 1. **检查源文件是否被包含在编译中**: - 在IDE(如e2 studio)中,检查项目中的`src`目录下是否有`r_bsp.c`文件,并确认它被包含在构建中。 - 如果没有,需要手动添加。 2. **检查FSP库的安装和配置**: - 确保已正确安装FSP库,并在项目中配置了正确的路径(包括头文件路径和库文件路径)。 - 在项目属性中,检查包含路径(include path)是否包含了FSP的`inc`目录。 3. **检查链接器设置**: - 确认链接器是否链接了包含这些函数的目标文件(例如,编译`r_bsp.c`生成的`r_bsp.o`)或库文件(如FSP提供的静态库)。 4. **检查宏定义配置**: - 有些函数可能依赖于特定的宏定义(例如,`BSP_CFG_RTOS_USED`)来启用或禁用某些代码段,确保这些宏定义与项目配置一致。 5. **重新生成FSP配置**: - 如果使用FSP配置工具(如RASC),尝试重新生成代码,以确保所有必要的文件都被包含。 具体到这三个函数,在FSP 5.9.0中: - `R_BSP_SystemInit`:位于`<fsp_root>/src/bsp/mcu/all/r_bsp.c`[^1]。 - `R_BSP_TimeInit`:同样位于`r_bsp.c`文件中[^2]。 - `R_BSP_MillisecondsGet`:如前所述,也在`r_bsp.c`中。 因此,确保`r_bsp.c`被编译是解决问题的关键。 如果问题仍然存在,可以考虑以下步骤: - 清理并重新构建整个项目。 - 检查是否有多个版本的FSP库导致冲突。 - 确认使用的FSP版本与项目兼容。 最后,如果用户使用的是自定义的链接脚本,确保没有错误地排除了必要的代码段。 由于用户是在ARM嵌入式项目中遇到问题,还需要注意: - 目标MCU的型号是否正确配置,因为不同的MCU可能有不同的启动文件和链接脚本。 - 启动文件(startup file)是否正确,它负责调用`R_BSP_SystemInit`等初始化函数。 示例:在瑞萨RA系列MCU的启动文件中(如`reset_vector.S`),通常会调用一个名为`_main`的函数,而`_main`会调用C库的初始化,然后调用`R_BSP_SystemInit`。因此,如果启动文件没有正确包含,也可能导致初始化函数未定义。 但是,链接错误指向的是这些函数本身,所以更可能是没有链接到包含这些函数的源文件。 总结:重点检查`r_bsp.c`是否被编译并链接。 如果用户没有使用IDE,而是使用命令行工具(如gcc),则需要确保在编译命令中包含了`r_bsp.c`文件,例如: ```bash arm-none-eabi-gcc -o project.elf startup.c main.c ... <fsp_root>/src/bsp/mcu/all/r_bsp.c ... ``` 或者,如果FSP被编译为库,则链接时需要指定该库: ```bash arm-none-eabi-gcc -o project.elf ... -L<path_to_fsp_lib> -lfsp ``` 注意:FSP通常以源代码形式提供,所以更常见的是直接编译所需的源文件。 由于用户的问题描述是链接错误,我们假设编译阶段已经通过(即头文件已找到),所以问题出在链接阶段。 因此,我们建议用户: 1. 检查构建日志,确认`r_bsp.c`是否被编译(是否生成了`r_bsp.o`)。 2. 如果没有,则在项目中添加该文件并重新构建。 如果用户已经包含了`r_bsp.c`但仍然出现链接错误,那么可能是条件编译导致这些函数没有被包含。例如,某些宏定义关闭了这些函数的实现。这时需要检查`bsp_cfg.h`等配置文件,确保相关功能被启用。 例如,在`r_bsp.c`中,`R_BSP_SystemInit`函数的实现可能被`#ifdef`包围,确保配置宏`BSP_CFG_STARTUP_DISABLE`没有被定义(如果定义了这个宏,则跳过系统初始化)[^3]。 所以,请用户检查`bsp_cfg.h`中的配置: ```c #define BSP_CFG_STARTUP_DISABLE (0) // 必须为0才能启用R_BSP_SystemInit ``` 类似地,`R_BSP_TimeInit`可能依赖于定时器配置。 综上所述,我们提供以下步骤: 步骤1:确认`r_bsp.c`被编译。 步骤2:检查FSP配置头文件(如`bsp_cfg.h`)中的相关宏定义是否正确。 步骤3:重新生成FSP配置(如果使用了RASC工具)。 步骤4:清理并重新构建项目。 如果以上步骤无法解决问题,可能需要检查FSP版本是否正确安装,或者考虑重新安装FSP。 由于嵌入式项目的复杂性,如果用户提供了更多信息(如构建日志、项目结构),可以进一步分析。 最后,我们生成相关问题:</think>### 解决 ARM 嵌入式链接错误:未定义引用 `R_BSP_SystemInit` 等函数 #### 问题分析 当出现 `undefined reference to R_BSP_SystemInit/R_BSP_TimeInit/R_BSP_MillisecondsGet` 链接错误时,表明**编译器找到了函数声明(头文件),但链接器找不到函数实现**。这些函数属于瑞萨 FSP 库的核心 BSP(板级支持包)模块,常见原因如下: 1. **FSP 库未正确链接** - 缺少编译 `r_bsp.c` 文件(函数定义位置) - 未将 FSP 库路径添加到链接器搜索目录 - 未在 Makefile 中链接 FSP 静态库(如 `libfsp.a`) 2. **工程配置错误** - 未启用 BSP 模块(FSP 配置工具中遗漏) - 目标 MCU 型号与 FSP 库不匹配 - 中断向量表未指向 `R_BSP_SystemInit` 3. **代码调用时序问题** - 在 BSP 初始化前调用了时间函数 - RTOS 配置冲突(`BSP_CFG_RTOS_USED` 宏定义错误) --- #### 解决方案(逐步操作) ##### 步骤 1:确认源文件包含 这些函数定义在 FSP 库的 **`<fsp_root>/src/bsp/mcu/all/r_bsp.c`** 中: ```c /* R_BSP_SystemInit 实现 (简化) */ void R_BSP_SystemInit(void) { SystemInit(); // CMSIS 系统初始化 BSP_CFG_CLOCK_Init(); // 时钟配置 ... } /* R_BSP_TimeInit 实现 */ void R_BSP_TimeInit(void) { g_bsp_Locks[g_bsp_lock_timer].ctr = 0; // 复位计时器 EnableTimerInterrupt(); // 启用定时器中断 } /* R_BSP_MillisecondsGet 实现 */ uint32_t R_BSP_MillisecondsGet(void) { #if BSP_CFG_RTOS_USED == 0 return g_bsp_Locks[g_bsp_lock_timer].ctr / 1000; #else return xTaskGetTickCount() * portTICK_PERIOD_MS; #endif } ``` **操作**: - 检查工程是否包含 `r_bsp.c` 文件(在 e² studio 中右键项目 > Properties > C/C++ Build > Settings > Source Files) - 确认文件路径包含在编译列表中 ##### 步骤 2:配置链接器设置 在 Makefile 或 IDE 链接器配置中添加: ```makefile # 添加 FSP 库搜索路径 LIBRARY_DIRS += <fsp_root>/src/bsp/mcu/all LIBRARY_DIRS += <fsp_root>/board/ra6m5_ek # 链接必要库 LDLIBS += -lfsp -lcmsis -lboard ``` **注意**:`<fsp_root>` 需替换为实际 FSP 安装路径(如 `C:/Renesas/FSP_5.9.0`) ##### 步骤 3:检查 FSP 配置 1. 打开 **RASC (Renesas Advanced Smart Configurator)** 2. 在 **Stacks** 标签页中确认已添加: - **BSP > System Initialization**(生成 `R_BSP_SystemInit`) - **BSP > Time Initialization**(生成 `R_BSP_TimeInit`) 3. 生成代码(点击 **Generate Project Content**) ##### 步骤 4:验证启动流程 确保启动文件正确调用初始化函数(以 RA6M5 的 `reset_handler` 为例): ```assembly reset_handler: ldr r0, =_main blx r0 ; 跳转到 main() ... _main: bl R_BSP_SystemInit ; 必须首先调用! bl R_BSP_TimeInit bl main ; 用户主函数 ``` ##### 步骤 5:处理 RTOS 冲突 若使用 FreeRTOS: ```c // 在 bsp_cfg.h 中正确定义 #define BSP_CFG_RTOS_USED (2) // 1=Azure RTOS, 2=FreeRTOS // 在 FreeRTOSConfig.h 中确保启用时间统计 #define configUSE_TIMERS 1 #define configGENERATE_RUN_TIME_STATS 1 ``` --- #### 验证方法 1. **符号表检查**: ```bash arm-none-eabi-nm project.elf | grep R_BSP_ ``` 应输出: ``` 20001200 T R_BSP_SystemInit 20001280 T R_BSP_TimeInit 20001300 T R_BSP_MillisecondsGet ``` 2. **最小测试代码**: ```c #include "bsp_api.h" int main(void) { R_BSP_SystemInit(); // 必须最先调用 R_BSP_TimeInit(); uint32_t ms = R_BSP_MillisecondsGet(); while(1); } ``` --- #### 常见问题排查表 | 现象 | 解决方法 | |------|----------| | 仅 `R_BSP_MillisecondsGet` 未定义 | 检查 `BSP_CFG_RTOS_USED` 宏定义 | | 启动时立即崩溃 | 确认 `R_BSP_SystemInit` 是第一个调用的函数 | | 时间计数不更新 | 验证定时器中断是否启用(`system_tick_isr`) | | RTOS 下链接失败 | 添加 `-lfreertos` 并检查 `vTaskStartScheduler` 调用 | > 若仍存在问题,建议在 **RASC 中重新生成 BSP 配置**,并清理工程后完整重建[^1][^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值