有谁知道如何处理以下问题:
我有一个 IAR 嵌入式工作台。该项目也使用 SDRAM 和闪存 ROM 来运行其代码。SDRAM 的代码是从 SD 卡加载的。然而,在SDRAM中还存储了一些数据,例如全局变量或静态变量。其中一些必须初始化。初始化步骤,即iar_data_init3函数调用,在函数之后进行low_level_init。所以问题是,为了初始化 SDRAM 中的某些变量,需要从 调用初始化函数iar_data_init3,其代码位于 SDRAM 本身内部。这是错误的,因为尚未完成从 SD 卡加载 SDRAM 代码的操作。
我已尝试按照 C/C++ 开发指南中所述进行手动初始化,但这没有帮助。
调用的函数是__sti__routine,它提供变量的初始化。所有这些函数都是由 IAR 生成的。有什么方法可以告诉链接器将初始化函数放入Flash ROM中吗?
编辑 1: 这是来自 IAR C/C++ 手册的信息。这是如何使用手动初始化的示例。
在链接器配置文件中:
initialize manually { section MYSECTION };
Run Code Online (Sandbox Code Playgroud)
然后 IAR 文档说:
您可以使用此源代码示例来初始化该部分:
#pragma section = "MYSECTION"
#pragma section = "MYSECTION_init"
void DoInit()
{
char * from = __section_begin("MYSECTION_init");
char * to = __section_begin("MYSECTION");
memcpy(to, from, __section_size("MYSECTION"));
}
Run Code Online (Sandbox Code Playgroud)
然而,我无法理解,首先,MYSECTION_init 和 MYSECTION …
假设我们想在地址 say 处写入0xc000,我们可以在 C 中定义一个宏:
#define LCDCW1_ADDR 0xc000
#define READ_LCDCW1() (*(volatile uint32_t *)LCDCW1_ADDR)
#define WRITE_LCDCW1(val) ((*(volatile uint32_t *)LCDCW1_ADDR) = (val))
Run Code Online (Sandbox Code Playgroud)
我的问题是,当使用任何微控制器时,考虑一个例子MSP430,P1OUT寄存器地址是0x0021。
但是当我们使用P1OUT=0xFFFF时;// 它为 P1OUT 分配一个值 0xFFFF。
我的问题是它如何写入该地址,例如在本例中为 0x0021。IDE是IAR。我在头文件 msp430g2553.h 中找到了以下定义:
#define P1OUT_ (0x0021u) /* Port 1 Output */
DEFC( P1OUT , P1OUT_)
Run Code Online (Sandbox Code Playgroud)
我想它正在定义地址,但是其他要写入或读取的宏在哪里。
谁能解释一下 P1OUT 如何在该特定地址位置写入的流程?另外请告诉我 0x0021u 中的 u 是什么意思?
谢谢
到目前为止我发现的细节是:
在 msp430g2553.h 中
#ifdef __IAR_SYSTEMS_ICC__
#include "in430.h"
#pragma language=extended
#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define DEFW(name, address) __no_init volatile unsigned short …Run Code Online (Sandbox Code Playgroud) 我已经使用 IAR 嵌入式工作台很长一段时间了,但仍有一件事我无法理解。这就是断点操作的不一致之处。
我有一个运行 RTOS 的相当大的项目(这可能会影响问题吗?),当我放置断点时,不能保证调试器会在此断点处停止。有时会,有时不会。我发现的解决方法是手动停止处理器并在处理器暂停时放置断点。但即使这样也没有100%的成功率。
我正在生成调试信息并且正在调试模式下运行
有人遇到过类似的问题或者有什么想法吗?
我有一个小项目,我添加了自己的自定义调试功能,这样我就可以拥有一些额外的功能。他们一直工作得很好,并使用以下方法发送数据:
while(*bp)
ITM_SendChar(*bp++);
Run Code Online (Sandbox Code Playgroud)
我终于开始切换所有 printf 语句以使用我自己的函数,并且所有输出都停止了。稍微玩了一下,我发现只要我编译了一个 printf 函数,无论在哪里,ITM_SendChar 都能正常工作。
当在项目中使用 printf 时,似乎编译了一些功能,允许 ITM_SendChar 工作。
这不是什么大不了的事,但我很好奇为什么会这样。是否有另一种方法可以初始化 ITM(仪器跟踪宏单元)系统,而不必插入虚拟 printf?
有没有办法保存 IAR 窗口布局?每次我启动调试会话时,它都会在我的屏幕上填满 9 个不同的窗口。我会很高兴有 3 个和几个选项卡,但我每次都必须重新安排事情。我没有看到明显的方法来拯救它们,谷歌对此也没有太多可说的。
我在 IAR 中有以下类结构:
class A
{
public:
A(){}
virtual ~A() {};
virtual void load() {};
};
class C
{
public:
C()
{
//C does other stuff, not relevant
}
};
class D;
class B : public A
{
public:
B() : invert(false) {};
virtual ~B() {};
void load()
{
//Irrelevant stuff done here
}
private:
C member_c;
std::vector<D*> vector_of_d;
struct {
bool var_1:1;
bool var_2:1;
bool var_3:1;
bool var_4:1;
bool invert:1;
};
};
Run Code Online (Sandbox Code Playgroud)
我遇到了为初始化 B 而生成的程序集的错误,它似乎对 VTable 指针的位置与匿名结构位域的位置感到“困惑”。当它设置反转位为假时,它转到对象的第一个字(即 VTable 指针)并翻转地址中的一个位。当我稍后调用 …
// Preprocessor directive mention in <> formate :
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"
#include "limits.h"
#include "stddef.h"
#include "stdint.h"
...
int main()
{
FILE *fin, *fout; //Error[Pe020]: identifier "FILE" is undefined
...
...
...
fprintf(stderr, "%s\n", opus_get_version_string());
//Error[Pe020]: identifier "stderr" is undefined
}
Run Code Online (Sandbox Code Playgroud)
根据上面的代码我得到了两个错误:
1)“错误[Pe020]:标识符“FILE”未定义”
当我找到 stdlib.h 时,没有任何类型的“FILE”指令定义或 typedef。所以,请告诉我 stdlib.h 或 stdio.h 需要进行哪些更改
2)错误[Pe020]:标识符“stderr”未定义
那么,stderr定义在哪个头文件中呢?
请告诉我如何解决上述错误?
提前致谢。
我正在寻求compile_commands.json从我的 IAR .ewp 项目创建一个数据库。这将允许我在我的 vim 设置中使用智能 LSP 自动完成 ( ccls ) 和正确的语义突出显示 ( vim-lsp-cxx-highlight )。
我知道我可以手动创建一个与 .ewp 项目文件中的设置相同的 CMake 文件,但不幸的是我所有的同事都使用 IAR IDE。我可能会错过我的同事所做的一些重要的项目设置更改,并且我无法更新 .ewp。如果我可以自动将 .ewp 文件解析为 CMake,从而创建命令数据库,那就太好了。
有人知道这样做的聪明方法吗?如果没有,我将如何创建一个完全可以做到这一点的工具?看来,通过取消定义 Clang 编译器定义,可以使 ccls 充分利用 IAR 代码库。
我在 example.h 文件中有一个这样的类型结构:
typedef union{
uint16_t valNum;
struct{
uint8_t valNumH;
uint8_t valNumL;
};
} valueExp;
Run Code Online (Sandbox Code Playgroud)
我在 example.c 文件中使用这个结构:
uint16_t myFunction(uint16_t tempData){
uint8_t myData[8];
ValueExp mainValue;
mainValue.valNum=tempData;
myData[5]=mainValue.valNumH;
}
Run Code Online (Sandbox Code Playgroud)
当我分析 IAR-CSTAT 分析此函数时,出现此错误:
Union mainValue is written as valNum then read as another field - UNION-type punning
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个消息?
我在两个静态库libA和之间有循环依赖关系libB:
add_library(LibA STATIC a.c)
add_library(LibB STATIC b.c)
# Circular dependency: LibA <-> LibB
target_link_libraries(LibA PRIVATE LibB)
target_link_libraries(LibB PRIVATE LibA)
add_executable(Example main.c)
target_link_libraries(Example PRIVATE LibA LibB)
Run Code Online (Sandbox Code Playgroud)
生成构建配置时,CMake 尝试通过将LibA和分别传递LibB给链接器两次来解决这些依赖关系:
ilinkarm.exe --silent CMakeFiles\Example.dir\main.c.o LibA.lib LibB.lib LibA.lib LibB.lib -o Example.exe
Run Code Online (Sandbox Code Playgroud)
然而,我使用的 IAR 链接器已经多次遍历库列表,如果LibA和LibB只列出一次就足够了。与重复项的链接仍然有效,但我收到以下警告:
[build] Warning[Li065]: duplicate file: "LibA.lib"
[build] Warning[Li065]: duplicate file: "LibB.lib"
Run Code Online (Sandbox Code Playgroud)
是否有可能告诉 CMake,链接器命令中的每个库都必须是唯一的,即使具有循环依赖项?
我尝试设置CMAKE_C_LINK_EXECUTABLE,但找不到<LINK_LIBRARIES>似乎已经包含重复项的替代方案。这就是为什么这一行会产生相同的警告:
set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <OBJECTS> <LINK_FLAGS> <LINK_LIBRARIES> -o <TARGET>")
Run Code Online (Sandbox Code Playgroud)
CMake版本:3.26.3
Ninja版本:1.10.2
IAR版本:9.32.2