C标准规定,当变量的值可能会在程序正常执行流程之外更改时,应在变量的定义中使用volatile关键字。
如果在正常执行流程中更改(写入)了全局变量,并且仅在该正常流程之外(在中断中)读取。这个变量需要可变吗?又为什么呢?
根据我对cmake的理解,该工具负责处理文件路径和命令行长度,以避免达到8191个字符的窗口限制.
但是我在windows上交叉编译arm_none_eabi并且cmake没有使用响应文件或路径长度的任何其他解决方法生成makefile.因此链接步骤失败.
这是导致问题的生成的makefile行
XXXXX_EXTERNAL_OBJECTS =
XXXX_OBJECTS = \
"file1.c.obj" \
"file2.c.obj" \
"file3.c.obj" \
"fileXX.c.obj" \
C:/YYYY/GNU_Tools_ARM_Embedded/6-2016-q4-major/bin/arm-none-eabi-gcc.exe -mcpu=cortex-m4 -mthumb -DSTM32L4__xx -mfloat-abi=softfp -DXXXX -O0 -g -Wfatal-errors -Wall -Wno-unused-function -std=c99 -fdata-sections -ffunction-sections -mcpu=cortex-m4 -march=armv7e-m -O0 -g --specs=nano.specs -mthumb -Wl,--gc-sections -nostartfiles -Wl,-Map=$@.map -TC:SSSSSSSSS/STM32L4__RGTx_FLASH.ld $(XXXX_OBJECTS) $(XXXXX_EXTERNAL_OBJECTS) -o outHexFile_XXXX -LC:/YYYYYYYYYYYYYYYY/arm-nano-eabi/lib
Run Code Online (Sandbox Code Playgroud)
最终的行长度约为23000个字符(远超过8191).
为什么Cmake没有生成windows可用的makefile?这只是因为我在进行交叉编译吗?我该怎么做才能避免这个问题?
编辑
Generator是GNU Makefiles
CMake版本3.7.2
编辑2
这可能会在将来的版本中自动处理
通过klocwork分析时,以下行
pTxData[index] = ( UINT8_C(0) << UINT8_C(4) );
Run Code Online (Sandbox Code Playgroud)
给出错误
按位运算的操作数的类型为“符号字符”,而不是“无符号整数”
我已经通过删除任何问题将问题减少到最低程度,#define
并且完全不知道为什么会发生这种情况。
我正在努力改进我的嵌入式编码实践.下面的代码将值0写入内存位置0x80001000
.
#define MemoryWrite(A,V) *(volatile unsigned long*)(A)=(V)
#define FLAG 2147487744 //0x80001000
uint32_t reset_value = 0;
int main(void)
{
MemoryWrite(FLAG, reset_value);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
为了使用MemoryWrite
我必须转换0x80001000
为的宏2147487744
.我认为这使得代码不清楚.有没有办法只使用十六进制值才能做到这一点?
我定义reset_value
为uint32_t
.如果我使用它会改变什么#define
?
我正在尝试在 Cortex-M4 上进入待机模式。正常的行为是设备大约每 2 分钟唤醒一次,但在我最新的固件版本中,代码似乎是“随机”卡住的。
经过调查,代码似乎WFI
在没有进入待机状态的情况下传递了指令(无待机 => 无重置 => 无限循环 => ... => 42)。
因此,在阅读了许多不清楚的规范之后,我的理解是,WFI
如果存在待处理的中断,则可能不会进入睡眠状态。
WFI
?