小编Jul*_*ien的帖子

当仅在中断期间读取变量时需要挥发

C标准规定,当变量的值可能会在程序正常执行流程之外更改时,应在变量的定义中使用volatile关键字。

如果在正常执行流程中更改(写入)了全局变量,并且仅在该正常流程之外(在中断中)读取。这个变量需要可变吗?又为什么呢?

c embedded interrupt volatile

9
推荐指数
1
解决办法
259
查看次数

Cmake命令行窗口太长了

根据我对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

这可能会在将来的版本中自动处理

提交的bug

windows cmake

7
推荐指数
1
解决办法
2200
查看次数

了解Klocwork按位操作符号

通过klocwork分析时,以下行

pTxData[index] =  ( UINT8_C(0) << UINT8_C(4) );
Run Code Online (Sandbox Code Playgroud)

给出错误

按位运算的操作数的类型为“符号字符”,而不是“无符号整数”

我已经通过删除任何问题将问题减少到最低程度,#define并且完全不知道为什么会发生这种情况。

c bit-shift klocwork

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

c使用#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)

我有两个问题:

  1. 为了使用MemoryWrite我必须转换0x80001000为的宏2147487744.我认为这使得代码不清楚.有没有办法只使用十六进制值才能做到这一点?

  2. 我定义reset_valueuint32_t.如果我使用它会改变什么#define

c embedded hex

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

ARM WFI 不会休眠

我正在尝试在 Cortex-M4 上进入待机模式。正常的行为是设备大约每 2 分钟唤醒一次,但在我最新的固件版本中,代码似乎是“随机”卡住的。

经过调查,代码似乎WFI在没有进入待机状态的情况下传递了指令(无待机 => 无重置 => 无限循环 => ... => 42)。

因此,在阅读了许多不清楚的规范之后,我的理解是,WFI如果存在待处理的中断,则可能不会进入睡眠状态。

  1. 你能确认最后一句话吗
  2. 如何确保在调用之前清除所有挂起的中断WFI

arm interrupt cortex-m

0
推荐指数
1
解决办法
2911
查看次数

标签 统计

c ×3

embedded ×2

interrupt ×2

arm ×1

bit-shift ×1

cmake ×1

cortex-m ×1

hex ×1

klocwork ×1

volatile ×1

windows ×1