我正在尝试运行以下批处理命令.该命令已从IDE中提取,因此已确认正在运行.得到下面提到的错误.
我用双引号尝试了一些变化,但它们没有用.即使在powershell上它也有相同的信息.
C:\Program Files\IAR Systems\Embedded Workbench 7.0\430\bin\icc430.exe F:\CP001\source\Meter\Main.c -D Hardware_P20E -D Calibration_code -D _Optical -D _Configuration_TS0382 -o F:\CP001\Temp\C20EO\Obj\ --no_cse --no_unroll --no_inline --no_code_motion --no_tbaa --debug -D__MSP430F425 -e --double=32 --dlib_config C:\Program Files\IAR Systems\Embedded Workbench 7.0\430\lib\dlib\dl430fn.h -Ol --multiplier=16 --segment __data16=DATA16 --segment __data20=DATA20
Run Code Online (Sandbox Code Playgroud)
更新:
尝试使用引号解决方案会以某种方式混淆编译器
我有一个简单的函数测试,如果两个数组彼此相反。它们似乎是相同的,只是tmp
变量不同。一个有效,另一个无效。我一辈子都无法弄清楚为什么编译器会对此进行优化-如果确实存在优化问题(我的编译器是IAR Workbench v4.30.1)。这是我的代码:
// this works as expected
uint8 verifyInverseBuffer(uint8 *buf, uint8 *bufi, uint32 len)
{
uint8 tmp;
for (uint32 i = 0; i < len; i++)
{
tmp = ~bufi[i];
if (buf[i] != tmp)
{
return 0;
}
}
return 1;
}
// this does NOT work as expected (I only removed the tmp!)
uint8 verifyInverseBuffer(uint8 *buf, uint8 *bufi, uint32 len)
{
for (uint32 i = 0; i < len; i++)
{
if (buf[i] != (~bufi[i]))
{ …
Run Code Online (Sandbox Code Playgroud) 在我的链接器脚本文件中,我定义了两个符号
define symbol _region_RAM_start__ = 0xC0000000;
define symbol _region_RAM_end__ = 0xC00fffff;
Run Code Online (Sandbox Code Playgroud)
然后我将它们导出,如下所示
export symbol _region_RAM_start__;
export symbol _region_RAM_end__;
Run Code Online (Sandbox Code Playgroud)
从applciation代码,我尝试访问这些符号
extern const unsigned int _region_RAM_start__;
extern const unsigned int _region_RAM_end__;
....
int GetRAMSize()
{
int size = 0;
unsigned int address_1 = _region_RAM_start__;
unsigned int address_2 = _region_RAM_end__;
size = address_2 - address_1 + 1U;
return size;
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望返回值为0x00100000,但是,我得到的只是0.所以,当我转向调试器时,我注意到_region_RAM_start__和_region_RAM_end__分别具有值0xC0000000和0xC00fffff,但是address_1和address_2的值为0 .
编译器优化设置为"无".这一直困扰着我一段时间.在这里我是否有一些非常明显的东西(除了我不应该首先这样做)?
解决方案 感谢nm的答案
unsigned int address_1 = (unsigned int) (&_region_RAM_start__);
Run Code Online (Sandbox Code Playgroud)
否则address_1和address_2都包含垃圾值(即分别在地址0xC0000000和0xC00fffff处可用的值,但从此代码的角度来看是垃圾)
到目前为止,我一直在使用IAR,但它有时会崩溃并且没有代码完成.此外,我使用的其他开发环境是基于eclipse的.我应该买哪一个?
我在嵌入式C源文件中遇到了以下定义:
const preamble_t OAD_Preamble @ ".preamble" =
{
HAL_OAD_RC_MAX, // Default program length of max if not using post-processing tool.
OAD_MANUFACTURER_ID, // Manufacturer ID
OAD_TYPE_ID, // Image Type
0x00000001 // Image Version
};
Run Code Online (Sandbox Code Playgroud)
我不知道@部分,你能帮我解决这个问题吗?
编辑:这是在IAR编译器中,与TI SoC一起使用.
有没有办法在STM32F4上上传程序时用计算机信息更新RTC?例如,计算机上的日期和时间信息是:12h40 11/09/2018,当我用IAR/AC6刷新微控制器时,RTC被设置为这些信息?
我在我的项目中使用了一个头文件,其中包含以下定义:
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
#define __I volatile /*!< Defines 'read only' permissions*/
#else
#define __I volatile const /*!< Defines 'read only' permissions*/
#endif
Run Code Online (Sandbox Code Playgroud)
将__I
被用作在另一头文件如下:
typedef struct {
// more members before
__I uint32_t CR; /*!< GPIO Commit*/
// more members after
} GPIOA_Type;
#define GPIOF_BASE 0x40025000UL
#define GPIOF ((GPIOA_Type *) GPIOF_BASE)
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么__I
在C中使用const而不是在C++中?您仍然可以修改CR指向的值,因为您有地址,但我只是好奇为什么定义__I
不同.
对于任何感兴趣的人来说,这些__I
定义来自IAR Embedded Workbench ARM for Cortex-M4,结构来自德州仪器LM4F120H5QR CMSIS文件.
我正在运行Ubuntu 10.04和Wine 1.2.我能够安装IAR软件,但无法找到加密狗许可证.无论如何在Wine和Ubuntu中使用加密狗许可证还是我必须使用PC许可证?
提前致谢..
我试图将C项目转换为C++.
在C项目中,我在编译成c ++时反击了这个错误:
错误[Pe513]:无法将类型为"void*"的值分配给"uint8_t*"类型的实体
以下代码给出了此错误:
#define RAM32Boundary 0x20007D00
uint8_t *pNextRam;
pNextRam = (void*)RAM32Boundary;// load up the base ram
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这在C中做了什么以及如何将其转换为C++?
我正在使用IAR C编译器来构建嵌入式微应用程序(特别是瑞萨的uPD78F0537).在这个应用程序中,我使用两个嵌套的for循环来初始化一些数据,如下面的MCVE所示:
#include <stdio.h>
#define NUM_OF_OBJS 254
#define MAX_OBJ_SIZE 4
unsigned char objs[NUM_OF_OBJS][MAX_OBJ_SIZE];
unsigned char srcData[NUM_OF_OBJS][MAX_OBJ_SIZE];
void main(void)
{
srcData[161][2] = 10;
int x, y;
for (x = 0; x < NUM_OF_OBJS; x++)
{
for (y = 0; y < MAX_OBJ_SIZE; y++)
{
objs[x][y] = srcData[x][y];
}
}
printf("%d\n", (int) objs[161][2]);
}
Run Code Online (Sandbox Code Playgroud)
输出值为0,而不是10.
编译器为for循环生成以下代码:
13 int x, y;
14 for (x = 0; x < NUM_OF_OBJS; x++)
\ 0006 14.... MOVW DE,#objs
\ 0009 16.... MOVW HL,#srcData
15 …
Run Code Online (Sandbox Code Playgroud) iar ×10
c ×6
embedded ×5
c++ ×3
batch-file ×1
cmsis ×1
command-line ×1
cortex-m ×1
linker ×1
linux ×1
msp430 ×1
stm32 ×1
ubuntu ×1
ubuntu-10.04 ×1