标签: iar

IAR 初始化函数放置

有谁知道如何处理以下问题:
我有一个 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 …

embedded iar

5
推荐指数
1
解决办法
2万
查看次数

嵌入式 C:寄存器访问

假设我们想在地址 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)

c compiler-construction embedded msp430 iar

5
推荐指数
1
解决办法
5594
查看次数

IAR Embedded Workbench 断点失败

我已经使用 IAR 嵌入式工作台很长一段时间了,但仍有一件事我无法理解。这就是断点操作的不一致之处。

我有一个运行 RTOS 的相当大的项目(这可能会影响问题吗?),当我放置断点时,不能保证调试器会在此断点处停止。有时会,有时不会。我发现的解决方法是手动停止处理器并在处理器暂停时放置断点。但即使这样也没有100%的成功率。

我正在生成调试信息并且正在调试模式下运行

有人遇到过类似的问题或者有什么想法吗?

msp430 iar

5
推荐指数
1
解决办法
4001
查看次数

STM32 IAR 没有 ITM 跟踪输出,除非代码中包含 printf

我有一个小项目,我添加了自己的自定义调试功能,这样我就可以拥有一些额外的功能。他们一直工作得很好,并使用以下方法发送数据:

while(*bp)
  ITM_SendChar(*bp++);
Run Code Online (Sandbox Code Playgroud)

我终于开始切换所有 printf 语句以使用我自己的函数,并且所有输出都停止了。稍微玩了一下,我发现只要我编译了一个 printf 函数,无论在哪里,ITM_SendChar 都能正常工作。

当在项目中使用 printf 时,似乎编译了一些功能,允许 ITM_SendChar 工作。

这不是什么大不了的事,但我很好奇为什么会这样。是否有另一种方法可以初始化 ITM(仪器跟踪宏单元)系统,而不必插入虚拟 printf?

embedded printf stm32 iar cortex-m

5
推荐指数
1
解决办法
1280
查看次数

IAR 窗口布局

有没有办法保存 IAR 窗口布局?每次我启动调试会话时,它都会在我的屏幕上填满 9 个不同的窗口。我会很高兴有 3 个和几个选项卡,但我每次都必须重新安排事情。我没有看到明显的方法来拯救它们,谷歌对此也没有太多可说的。

iar

5
推荐指数
1
解决办法
2132
查看次数

成员结构位域元素的初始化列表初始化导致 IAR ARM 中的错误

我在 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 指针)并翻转地址中的一个位。当我稍后调用 …

c++ arm vtable iar bit-fields

5
推荐指数
1
解决办法
261
查看次数

错误[P​​e020]:标识符“FILE”在 IAR Workbench 中未定义

// 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定义在哪个头文件中呢?

请告诉我如何解决上述错误?

提前致谢。

compiler-errors file stderr iar

5
推荐指数
1
解决办法
5261
查看次数

如何将 IAR .ewp 转换为 LSPcompile_commands.json 数据库

我正在寻求compile_commands.json从我的 IAR .ewp 项目创建一个数据库。这将允许我在我的 vim 设置中使用智能 LSP 自动完成 ( ccls ) 和正确的语义突出显示 ( vim-lsp-cxx-highlight )。

我知道我可以手动创建一个与 .ewp 项目文件中的设置相同的 CMake 文件,但不幸的是我所有的同事都使用 IAR IDE。我可能会错过我的同事所做的一些重要的项目设置更改,并且我无法更新 .ewp。如果我可以自动将 .ewp 文件解析为 CMake,从而创建命令数据库,那就太好了。

有人知道这样做的聪明方法吗?如果没有,我将如何创建一个完全可以做到这一点的工具?看来,通过取消定义 Clang 编译器定义,可以使 ccls 充分利用 IAR 代码库。

vim cmake iar language-server-protocol

5
推荐指数
1
解决办法
1231
查看次数

IAR CSTAT 分析中的 UNION 类型双关错误

我在 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)

我该如何解决这个消息?

c static-analysis iar

5
推荐指数
1
解决办法
177
查看次数

如何告诉 CMake 在链接命令中不传递重复的库

我在两个静态库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 链接器已经多次遍历库列表,如果LibALibB只列出一次就足够了。与重复项的链接仍然有效,但我收到以下警告:

[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

c linker cmake iar ninja

5
推荐指数
1
解决办法
674
查看次数