C++ c/c++;从stm32中的另一个类获取180数组之类的大数据
我有一个32位的ARM Cortex M4()来编写两个类,每个类在Pixhawk代码库设置中都是一个线程。C++ c/c++;从stm32中的另一个类获取180数组之类的大数据,c++,stm32,C++,Stm32,我有一个32位的ARM Cortex M4()来编写两个类,每个类在Pixhawk代码库设置中都是一个线程。 第一个是激光雷达扫描仪,它处理传入的串行数据并生成“障碍情况”。第二种是算法,它处理“障碍情况”并采取一些规划策略。这是我现在的解决方案,使用参考函数LidarScanner::updateObstacle(uint8_t(&array)[181])更新“障碍情况”,即181大小的数组 LidarScanner.cpp: class LidarScanner{ private:
第一个是激光雷达扫描仪,它处理传入的串行数据并生成“障碍情况”。第二种是算法,它处理“障碍情况”并采取一些规划策略。这是我现在的解决方案,使用参考函数LidarScanner::updateObstacle(uint8_t(&array)[181])更新“障碍情况”,即181大小的数组 LidarScanner.cpp:
class LidarScanner{
private:
struct{
bool available = false;
int AngleArr[181];
int RangeArr[181];
bool isObstacle[181] = {}; //1: unsafe; 0:safe;
}scan;
......
public:
LidarScanner();
//main function
void update()
{
while(hal.uartE->available()) //incoming serial data is available
{
decode_data(); //decode serial data into three kind data: Range, Angle and Period_flag
if(complete_scan()) //determine if the lidarscanner one period is completed
{
scan.available = false;
checkObstacle(); //check obstacle situation and store safety in isObstacle[181]
scan.available = true;
}
}
}
//for another API recall
void updateObstacle(uint8_t (&array)[181])
{
for(int i=0; i<=181; i++)
{
array[i]=scan.isObstacle[i];
}
}
//for another API recall
bool ScanAvailable() const { return scan.available; }
......
}
通常,它工作得很好。但是我想提高表现,所以我想知道最有效的方法是什么。谢谢 复制数据的最有效方法是使用DMA
DMAx_Channelx->CNDTR = size;
DMAx_Channelx->CPAR = (uint32_t)&source;
DMAx_Channelx->CMAR = (uint32_t)&destination;
DMAx_Channelx->CCR = (0<<DMA_CCR_MSIZE_Pos) | (0<<DMA_CCR_PSIZE_Pos)
| DMA_CCR_MINC | DMA_CCR_PINC | DMA_CCR_MEM2MEM ;
while(!(DMAx->ISR & DMA_ISR_TCIFx ));
DMAx\u Channelx->CNDTR=size;
DMAx_Channelx->CPAR=(uint32_t)和source;
DMAx\u Channelx->CMAR=(uint32\u t)和目的地;
DMAx_Channelx->CCR=(0DMA不太适合于内存到内存的复制。尤其是当数据甚至不需要复制时…@dashwuff处理器在复制数据方面更差(速度是原来的两倍)。数据可能不需要复制,对不对。但这还不清楚。是否需要复制数据?
DMAx_Channelx->CNDTR = size;
DMAx_Channelx->CPAR = (uint32_t)&source;
DMAx_Channelx->CMAR = (uint32_t)&destination;
DMAx_Channelx->CCR = (0<<DMA_CCR_MSIZE_Pos) | (0<<DMA_CCR_PSIZE_Pos)
| DMA_CCR_MINC | DMA_CCR_PINC | DMA_CCR_MEM2MEM ;
while(!(DMAx->ISR & DMA_ISR_TCIFx ));