C++ c/c++;从stm32中的另一个类获取180数组之类的大数据

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:

我有一个32位的ARM Cortex M4()来编写两个类,每个类在Pixhawk代码库设置中都是一个线程。
第一个是激光雷达扫描仪,它处理传入的串行数据并生成“障碍情况”。第二种是算法,它处理“障碍情况”并采取一些规划策略。这是我现在的解决方案,使用参考函数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 ));