问题标签 [iar]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - ANSI C 中的自赋值
我目前正在开发一个嵌入式 C 项目,并且我“继承”了一些包含以下语句的旧代码:
其中 rxStruct 是一个变量。
这样的陈述有什么用?
jenkins - 无法从 Jenkins 构建 IAR
我在从 Jenkins Windows 批处理插件构建 IAR 项目时遇到问题。然而,相同的命令直接从内置命令提示符的相同机器上运行得很好。
构建命令:“C:\Program Files\IAR Systems\Embedded Workbench 6.4\common\bin\iarbuild”protective\iar_project\cpup_project.ewp -build Debug -log all
从 Jenkins 构建时,会发生以下错误:
致命错误[c0000142]:不受控制的终止
运行 C/C++ 编译器时出错
相同的版本,即完全相同的版本,以前也曾在 Jenkins 上工作过。没有对 Jenkins 进行任何额外的升级。
系统:Windows XP
詹金斯版本:1.466.1
有谁知道这是什么原因造成的?
我该如何纠正?
debugging - UART 代码端口后的 TI MSP430 中断问题
我将 MSP430F2013 处理器用于没有 UART 的应用程序。我需要一个 UART,因此我使用了 TI 的示例代码“msp430x20x3_ta_uart2400.c”来模拟一个使用 Timer 模块的代码。这一切都很好(使用 IAR Embedded Workbench 编译),使用 PuTTY 将字符传输到开发板并使用环回将它们回显到终端对其进行了测试。
这是一个降低风险的练习,现在我已经将该代码移植到我的应用程序的状态机中。完成此操作后,我遇到了有关定时器中断和低功耗睡眠模式的问题。这是我进入低功耗(睡眠)模式的代码片段:
我在调试器 (C-Spy) 上看到的是,有时它会bis_SR_register()
在第一次进入时执行该行,然后转到if
语句,即忽略我已要求它进入睡眠状态的事实。在其他情况下,当它应该进入睡眠状态时,ISR 会正确触发并最终将我带回if
语句以继续程序执行(正如我所期望的那样)。但是,如果我尝试跳到下一条语句,应用程序会在第一行冻结,即我无法前进。
我想不出与我正在做的 TI 示例在功能上有何不同,所以我认为我的问题一定与我如何移植它有关。例如,我的 Timer ISR 和我在此处发布的代码位于不同的编译单元中 - 这种决定会对事情产生任何影响吗?我知道我的问题可能有点含糊,但不幸的是我不能发布我的所有代码,所以我正在寻找具有 MSP 经验的人,他们可能能够提出一些值得关注的事情或一些潜在的陷阱我可能陷入了。
assembly - AVR Assembly中ARGFRAME和LOCFRAME的含义
为了调试我编写的一些 C 代码中的问题,我正在检查由 IAR AVR 编译器生成的一些汇编代码。在 .s90 文件的顶部声明了几个函数。每个函数声明具有以下形式:
有谁知道 ARGFRAME 和 LOCFRAME 指令是做什么的?它们仅在 IAR EWAVR 汇编器参考中简要提及。有时我看到使用 RSTACK 作为 ARGFRAME 的参数而不是 CSTACK 声明的函数:
有人知道将 RSTACK 与 CSTACK 与 ARGFRAME 结合使用的原因吗?
c++ - 如何在 ARM 的 IAR 嵌入式工作台中编译包含 C 和 C++ 源文件的项目?
我有两个 IAR 嵌入式工作台项目(用于 Cortex-M3 ARM),其中一个是用 C 编写的,另一个是用 C++ 编写的。
我需要合并这两个项目中的一些文件来创建一个新项目,并且由于某些原因,我无法为非我的项目更改语言(例如,我在 c++ 项目中使用了 OOP,而在另一个项目中使用了一些本机 c 函数)。
现在我正在寻找一种解决方案来组合这些项目并在 IAR 嵌入式工作台 6 中编译它。有
什么想法吗?
c - 如何从 IAR EWARM 的内联汇编程序调用另一个模块中的 C 函数?
我在硬故障处理程序中有一些组装。该程序集基本上是为了将当前堆栈指针作为参数传递(在 R0 中)。看起来是这样...
当 SavePC 在同一个 c 文件中时,这可以正常工作。但是,当将 SavePC 放在另一个 c 文件中时,我没有运气。我试图像这样导入函数......
...但我一定做错了什么。编译器报告以下...
带有程序集的 c 文件包括带有 SavePC 原型的头文件...
建议?
c - 多种获取地址的方法
在 IAR C/C++ Compiler 手册中,它指出编写优化友好的源代码:
避免使用 & 运算符获取局部变量的地址。由于两个主要原因,这是低效的。首先,变量必须放在内存中,因此不能放在处理器寄存器中。这会导致代码更大更慢。其次,优化器不能再假设局部变量不受函数调用的影响。
还有哪些其他方法可以获取局部变量的地址?显然,我知道如果我有一个指向该变量的指针,我可以使用它,如果我有一个数组,我可以使用数组名称,但是我不知道除& 操作员。
assembly - GCC 内联汇编到 IAR 内联汇编
我正在尝试将BeRTOS用于德州仪器 Stellaris Cortex-M3。我的工作环境是 IAR。为了适应 IAR 和我正在使用的特定 uC,进行了很多细微的更改,但我有一个似乎无法解决的问题……坦率地说,这有点超出我的想象。
这段代码:
...正在产生一些错误和警告。
错误:预期一个“;” -----> 第 3 行
错误:预期为“(” -----> 第 5 行
错误:预期为“)” -----> 第 9 行
警告:变量“__n”已声明但从未引用 -----> 第 3 行
有什么建议么?
linker - IAR 链接器无法识别 .a 库
我正在为 ST 的带有 ARM Cortex-M4F 内核的 STM32F4-Discovery 开发套件开发应用程序。
我在我的应用程序中使用 FreeRTOS,它旨在使用电路板的麦克风和扬声器输出。
我正在尝试使用 ST 的音频播放和录制演示作为设置麦克风 I2S 接口的示例。但是我在这个例子的 PDM 过滤器库上遇到了困难。该库作为.a
文件提供,当我尝试将其复制到我的项目中时,我在链接期间收到此消息:
致命错误[Li004]:文件“C:\Users\Daniel\Desktop\FreeRTOSV7.3.0\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK\libPDMFilter_IAR.a”不是对象或存档文件
我试着弄乱链接器选项并说要手动添加这个库。但没有结果。有谁知道如何.a
在 IAR 中链接库?
linker - IAR 重定位失败错误
有一个项目成功编译链接并在设备上运行。但是在告诉链接器它应该将应用程序代码的一部分放到 ROM 内存而不是 SDRAM 之后,我在链接步骤中收到以下错误:
错误[Lp002]:重定位失败:值超出范围或非法:0x60000545 种类:R_ARM_PREL31[0x2a] 位置:0xa0000030 模块:I:\Project\Debug\Obj\fileOper.o 部分:128 (.ARM.exidx) 偏移量: 0x0 目标:0x00000574 “SECTION_FILEOP_87”模块:I:\Project\Debug\Obj\fileOper.o 部分:104 (SECTION_FILEOP) 偏移量:0x4f4
我已阅读 IAR 的 C/C++ 指南。但它没有提供关于这个错误的足够好的解释。所以即使阅读手册我也无法得到这个错误的原因。任何人都可以帮助解决这个问题吗?实际上 IAR C/C++ 开发人员指南说:
对于每条不能正确重定位的指令,ILINK 都会产生一个重定位错误。这可能发生在目标无法触及或类型不兼容或许多其他原因的指令中。然后它提供了一个错误作为示例,这与我的情况不同。
编辑 1:我创建了一个重现相同错误的小项目,它仅包含 fileOper.cpp 和 main.cpp 文件。
用于告诉链接器如何将节放入内存的 ICF 文件:
定义符号 intvec_start = 0x10000000;
/ -内存区域- /
/ -闪存-/
定义符号 FLASH_ROM_start = 0x00000000;
定义符号 FLASH_ROM_end = 0x0007FFFF;
/*内部内存*/
定义符号 RAM_start = 0x10000000;
定义符号 RAM_end = 0x10017FFF;
/* SDRAM */
定义符号 SDRAM_start = 0xA0000000;
定义符号 SDRAM_end = 0xA1FFFFFF;
/ -尺寸- /
定义符号 size_stack = 0x4000;
定义符号 size_heap = 0x2000;
定义 size = 4G 的内存 mem;
定义区域 FLASH_region = mem:[从 FLASH_ROM_start 到 FLASH_ROM_end];
定义区域 RAM_region = mem:[从 RAM_start 到 RAM_end];
定义区域 SDRAM_region = mem:[从 SDRAM_start 到 SDRAM_end];
定义块 CSTACK 对齐 = 8, size = size_stack { };
定义块 HEAP 对齐 = 8, size = size_heap { };
用packing = zeros { readwrite }复制初始化;
不要初始化 { section .noinit };
放在地址 mem: intvec_start { section .intvec };
放置在 FLASH_region { readonly section .cstartup } 的开头;
放置在 RAM_region { block CSTACK };
放置在 SDRAM_region { 只读 }
除了 {readonly section FILEOP };
放置在 SDRAM_region { 读写 };
放入 SDRAM_region {块 HEAP};
放置在 FLASH_region { readonly section FILEOP };
fileOper.cpp:我已经更改了它,但它仍然重现相同的错误。