[其他ST产品] FreeRTOS中为什么要以这种宏定义方式访问指定地址的值?

[复制链接]
32|4
地瓜patch 发表于 2026-4-27 10:14 | 显示全部楼层 |阅读模式
在FreeRTOS中需要启用 ARM-Cortex 内核 CYCNT 寄存器。要实现这个功能,必须将地址为0xE0001000的 DWT_CTRL 寄存器的使能位置 1。
我不理解的是为什么要使用下面这种宏定义(第 1 行),把寄存器的值赋值给宏DWT_CTRL,然后像第 34 行那样去修改它?

#define DWT_CTRL *((volatile uint32_t*)0xE0001000)
int main(void)
{
  /* USER CODE BEGIN 1 */
        TaskHandle_t task1_handle;
        TaskHandle_t task2_handle;

        BaseType_t status;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  //Enable the CYCCNT

  DWT_CTRL |= (1<<0);

classroom 发表于 2026-4-27 11:16 | 显示全部楼层
宏直接硬编码地址,省得每次用都声明变量。
cr315 发表于 2026-4-27 11:17 | 显示全部楼层
加 volatile 防止编译器优化掉对寄存器的读写。
duo点 发表于 2026-4-27 11:18 | 显示全部楼层
转成指针再解引用,C语言里访问固定地址的标准写法。
elephant00 发表于 2026-4-27 11:22 | 显示全部楼层
宏展开后就是读写那个地址,代码更直观。
内政奇才 发表于 2026-4-27 11:56 | 显示全部楼层
读‑改‑写三步合并成一行,但硬件寄存器要小心副作用。
flycamelaaa 发表于 2026-4-27 12:23 | 显示全部楼层
把寄存器地址和操作封装在一起,改地址只改宏定义。
jcky001 发表于 2026-4-27 13:23 | 显示全部楼层
这种写法在嵌入式里叫“内存映射寄存器”。
在海边聆听 发表于 2026-4-27 13:57 | 显示全部楼层
这种宏访问方式在FreeRTOS、CMSIS、Linux驱动里都很常见。
onlycook 发表于 2026-4-27 14:24 | 显示全部楼层
不这样写,就得定义全局指针变量,浪费RAM还麻烦。
麻花油条 发表于 2026-4-27 14:59 | 显示全部楼层
一句话:这是嵌入式C里最简洁、高效、可靠的寄存器访问惯例。
powerantone 发表于 2026-4-27 16:24 | 显示全部楼层
宏在预处理阶段替换,没有函数调用的开销。
才没有脸红 发表于 2026-4-27 16:57 | 显示全部楼层
如果不用宏,每次写寄存器都要重复 ((volatile uint32_t*)地址)。
probedog 发表于 2026-4-27 18:24 | 显示全部楼层
用 |= 操作是为了只置1某一位,不影响其他位。
甜心puppy 发表于 2026-4-27 18:58 | 显示全部楼层
宏名大写提醒程序员这是寄存器,不是普通变量。
solty 发表于 2026-4-27 19:25 | 显示全部楼层
直接 DWT_CTRL = 1 会清掉其他位,容易出bug。
spicy 发表于 2026-4-27 19:25 | 显示全部楼层
第1行定义的是“寄存器”,第34行是“使用寄存器”。
茉璃夏 发表于 2026-4-27 19:48 | 显示全部楼层
地址0xE0001000是ARM内核定义的,文档里就这么用。
stormwind123 发表于 2026-4-27 21:26 | 显示全部楼层
这样做便于代码移植:换芯片只改宏里的地址值。
进入猫次元 发表于 2026-4-27 21:49 | 显示全部楼层
使用宏而不是函数,避免调用栈破坏寄存器访问的时效性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

2570

主题

16929

帖子

30

粉丝
快速回复 在线客服 返回列表 返回顶部
0