我的问题:说我在C++(或C)中定义一个函数.有没有类似于C++的auto或decltype,我可以在函数定义中使用它来声明一个局部变量,其类型是从我定义的函数的返回类型推断出来的?
示例:C和C++中的常见编码模式是
SomeType foo() {
SomeType x;
// ... do something to x ...
return x;
}
Run Code Online (Sandbox Code Playgroud)
而且我希望推断出第二个SomeType而不是明确地输入它.以下不起作用,但我希望我能以这种精神做点什么
SomeType foo() {
decltype(return) x; //<-- infer the function return type, which here is SomeType
// ... do something to x ...
return x;
}
Run Code Online (Sandbox Code Playgroud)
对于简单的返回类型,这并不是什么大问题,但是当返回类型很复杂时(比如返回类型是一个包含大量模板参数的模板类),不必重复那种类型会很好(并且不易出错)函数内部的定义.
我也不想改变功能定义来实现这一目标.因此,虽然在上面的示例中它可以将SomeType更改为宏,或者可能使foo成为模板函数而SomeType是模板参数,但我真的想看看我是否可以从返回类型中特别推断出类型周围的功能.
也许答案是"不可能",这是公平的,但我想知道这种或那种方式.
我正在使用 STM32H743。我有一个外部时钟信号进入 GPIO 引脚,我想非常准确地测量外部时钟信号中每个上升(或下降)沿之间经过的时间。所以我进行了设置,使 TIM4 由外部时钟触发,TIM5 由内部振荡器触发。
我编写了一个 IRQ,以便每当 TIM4 触发时,都会运行一个中断来捕获 TIM5 的值。它似乎工作正常,但我想知道是否可以通过 DMA 来避免所有上下文切换并释放 CPU。基本上我想设置一个 DMA,以便每个 TIM4 事件启动一个 DMA 传输,将 TIM5 计数器值复制到某个地方的循环缓冲区。
我已经搜索了论坛和 DMA 文档,但我对定时器寄存器是否可以是有效的 DMA 源感到模糊。我在想也许我可以做这样的事情:
hDma->PAR = (uint32_t) &htim5.Instance->CNT;
hDma->M0AR = (uint32_t) myBufferPtr;
hDma->NDTR = myBufferSize;
hDma->CR |= (uint32_t)DMA_SxCR_EN;
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否可行。
简短版本:我可以使用定时器的 CNT 寄存器作为 DMA 传输源吗?它会是外设到内存的传输吗?还是内存到内存的传输?我还需要其他标志来完成这项工作吗?或者不可能?或者是否有另一个 STM32 功能可以更轻松地计算脉冲之间的时间?