在C ++中的微控制器上执行强制转换为较小类型的推荐方法

问题描述

我正在为基于32位微控制器的Arduino Due进行编程。我想读取一个ADC结果寄存器(如果我正确的话,它的宽度为32位,但真正的最大宽度为12位,这是ADC的分辨率),然后将其写入数组的给定位置。宽度为16位的整数。

这有效:

volatile uint16_t Buf[nchannels];

[... some code...]

void ADC_Handler() {
  for (int i = 0; i < nchannels; i++)
  {
      Buf[i] = (volatile uint16_t) * (ADC->ADC_CDR + channels[i]); // my modification
  }
   FlagConversion = true;
}

但是改用更“明确”的演员表不起作用:

Buf[i] = dynamic_cast<volatile uint16_t *>(ADC->ADC_CDR + channels[i]);

产生:

“错误:无法dynamic_cast'(((size()类型)((((unsigned int)channels [i])* 4))))'(类型'RoReg * {aka volatile long unsigned int *}')键入“ volatile uint16_t * {aka volatile short unsigned int *}'(目标不是指针或对类的引用)”

以及类似的带有静态和重新解释类型转换的不清楚错误:

“错误:无法dynamic_cast'(((size()类型)((((unsigned int)channels [i])* 4))))'(类型为'RoReg * {aka volatile long unsigned int *}')键入“ volatile uint16_t * {aka volatile short unsigned int *}'(目标不是指针或对类的引用)”

“错误:从'volatile uint16_t * {aka volatile short unsigned int *}'到'uint16_t {aka short unsigned int}的无效转换”

  • 您知道为什么这些更明确的强制转换失败吗?
  • 这里的最佳做法是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)