Freerots项目管理之多任务处理

多任务处理项目架构搭建

/*
定时器计时5秒钟采集一遍数据(机具号、角度传感器、传感器2、打捆传感器、霍尔传感器)
SD卡 服务器连接时,有网:1、有数据就上传。2、没有数据就直接上传。    ;;没网:数据保存到SD卡里
GPS输出1秒钟1次
LCD刷新2秒一次
双摄像头 摄像头1 2.5分钟一次、摄像头2 5分钟一次 采集一次
GPRS 数据上传        MQTT 工作数据(传感器和GPS)HTTP 图片数据(摄像头1 图片1、摄像头2 图片2)
串口DEBUG信息打印

*/

/*
    Time2:HAL_TIM_PeriodElapsedCallback//定时10ms
    {
        
#if DEBUG_printf_test
        printf("定时1秒钟:%d",1s_time_count);
#else
#endif
        //定时器,时钟定时
    if (htim->Instance == htim2.Instance)
    {
            if(Usart1_Type.RX_IDLE_Usart1_flag)        // Receive flag,中断接收到串口数据
            {
                Usart1_Wait_Time++;
                if(Usart1_Wait_Time > 10)//串口接收超时100ms
                {
                    Usart1_Wait_Time = 0;    //清除串口接收计时
                    Usart1_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
                }
            }
            if(Usart2_Type.RX_IDLE_Usart2_flag)        // Receive flag,中断接收到串口数据
            {
                Usart2_Wait_Time++;
                if(Usart2_Wait_Time > 10)//串口接收超时100ms
                {
                    Usart2_Wait_Time = 0;    //清除串口接收计时
                    Usart2_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
                }
            }
            if(Usart3_Type.RX_IDLE_Usart1_flag)        // Receive flag,中断接收到串口数据
            {
                Usart3_Wait_Time++;
                if(Usart3_Wait_Time > 10)//串口接收超时100ms
                {
                    Usart3_Wait_Time = 0;    //清除串口接收计时
                    Usart3_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
                }
            }
            if(Usart4_Type.RX_IDLE_Usart1_flag)        // Receive flag,中断接收到串口数据
            {
                Usart4_Wait_Time++;
                if(Usart4_Wait_Time > 10)//串口接收超时100ms
                {
                    Usart4_Wait_Time = 0;    //清除串口接收计时
                    Usart4_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
                }
            }
            if(Usart5_Type.RX_IDLE_Usart1_flag)        // Receive flag,中断接收到串口数据
            {
                Usart5_Wait_Time++;
                if(Usart5_Wait_Time > 10)//串口接收超时100ms
                {
                    Usart5_Wait_Time = 0;    //清除串口接收计时
                    Usart5_Wait_Timeout_Flag = 1;//接收数据超时,完成接收
                }
            }
        }
    }
    
*/
/*
GPS定位单独一个线程
1、配置GPS连接,2、接收和解析GPS数据,3、10秒内最新GPS数据
{
    Init_GPS();//first_Init_falg = 0;//开机初始化,在规定时间内,没有初始化成功,再次初始化。
    
    GPS接收NVIC
    //USART DMA 空闲中断回调函数
    void Usart_Receive_IDLE(UART_HandleTypeDef *huart)
    {
        //DMA 空闲中断接收
        if(RESET != __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))   //判断是否是空闲中断
        {
            if(huart->Instance == USART1)//RS485 AB1
            {
                __HAL_UART_CLEAR_IDLEFLAG(&huart1);      //清楚空闲中断标志(否则会一直不断进入中断)
                HAL_UART_DMAStop(&huart1); //停止本次DMA传输
                Usart1_Type.RX_Usart1_Size = RX_Usart1_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//计算接收到的数据长度
                
                Usart1_Wait_Time = 0;    //清除串口接收计时
                Usart1_Type.RX_IDLE_Usart1_flag = 1; //跳出中断接收,到主程序里处理接收数据
                
                HAL_UART_Receive_DMA(&huart1, &Usart1_Type.RX_Usart1_pData[Usart1_Type.RX_Usart1_Size], (RX_Usart1_LEN - Usart1_Type.RX_Usart1_Size));//重启开始DMA
            }
            else if(huart->Instance == USART2)
            {
            }
        }
    }
    GPS接收RX
    void Usart1_User_Receive(void)
    {
        if(Usart1_Type.RX_IDLE_Usart1_flag)        // Receive flag,中断接收到串口数据
        {
            if(Usart1_Wait_Timeout_Flag == 1)//接收数据超时,完成接收
            {
                Usart1_Wait_Timeout_Flag = 0;//清除超时标志位
                HAL_UART_DMAStop(&huart1); //停止本次DMA传输
                Usart1_Type.RX_Usart1_Size = RX_Usart1_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//计算接收到的数据长度
                HAL_UART_Receive_DMA(&huart1, Usart1_Type.RX_Usart1_pData, RX_Usart1_LEN);//重启开始DMA传输 每次255字节数据
                
                Usart1_Type.RX_IDLE_Usart1_flag = 0;    // clean flag
                Usart1_Type.RX_Usart1_flag = 1;//完成接收标志位
            }
        }
    } 
    void Usart1_RX_Analy(void)
    {
        if(Usart1_Type.RX_Usart1_flag == 1)//完成接收标志位
        {
            Usart1_Type.RX_Usart1_flag = 0;
            //My_UART_Transmit(&huart5, Usart1_Type.RX_Usart1_pData, Usart1_Type.RX_Usart1_Size,30);//发送收到的数据
            
            
            //#define GPS_Online  1    //GPS在线
            //#define GPS_Offline 0    //GPS离线
            查看GPS数据长度是否完整;
            if(GPS_length >= XX)
            {
                GPS_status = GPS_Online;//GPS在线
                
                first_Init_falg = 1;//开机初始化成功
                GPS_status_Offline_count = 0;
//                memcpy( GPS_5s_Data, Usart1_Type.RX_Usart1_pData, Usart1_Type.RX_Usart1_Size);
//                if(GPS_Analyze_Time_flag == 1)//5秒内有完整GPS数据,解析其中一个数据
//                {
//                    GPS_Analyze_Time_flag = 0;
//                    解析GPS数据并保存;    
                    char *p;
                    p = strchr((char*)Usart1_Type.RX_Usart1_pData,'$');
                    GPS_Analyze(p);
//                }
            }
            else
            {
                GPS_status = GPS_Offline;//GPS离线
                
                GPS_status_Offline_count++;
                
                //#define GPS_Again_Init 100        //3分钟初始化失败
                //#define GPS_Offline_count 10    //离线次数10次
                if(first_Init_falg == 0)//开机初始化失败
                {
                    if(GPS_status_Offline_count >= GPS_Again_Init)
                    {
                        Init_GPS();//重新初始化
                    }
                    return;//同时返回
                }
                if(GPS_status_Offline_count >= GPS_Offline_count)
                {
                    LCD显示屏输出GPS离线;
                }
            }
            CLean_RX_Usart1_pData();//清空GPRS 串口USART1缓存数据
        }
    }
    void CLean_RX_Usart1_pData(void)
    {
        HAL_UART_DMAStop(&huart1); //停止本次DMA传输
        Usart1_Type.RX_Usart1_Size = 0;
        memset(Usart1_Type.RX_Usart1_pData,0,sizeof(Usart1_Type.RX_Usart1_pData));
        HAL_UART_Receive_DMA(&huart1, Usart1_Type.RX_Usart1_pData, RX_Usart1_LEN);//重启开始DMA传输 每次255字节数据
    }
    GPS接收TX
    
}
*/
/*
传感器采集数据单独一个线程
1、配置传感器参数{使能工作传感器},2、定时采集总线传感器数据,3、将采集传感器数据+GPS数据解析后保存到缓存空间{链表或队列};

    uint8_t Sensor_enble = 0;
    void Usart1_User_Send(void)
    {
        //节拍数时间:279 超时:400ms
        //传感器读取:条件1:打开5V使能电源;2:使能发送和接收引脚
        //读取第几个传感器
        //if(Sensor_enble)
        {
            Sensor_enble = 0;
            if(Usart1_485Tx_Rx == 0)//发送接收完成;超时等
            {
                Usart1_Rx_overtime_count = 3;//传感器超时读取次数5次
                //Sensor_Cmd_send(_1anglesensorcmd , sizeof(_1anglesensorcmd));//发送读取传感器数据指令
                if(Sensor_Cod == 1)//传感器1角度值 计算深度  节拍数时间:279
                {
                    Sensor_Cmd_send(_1anglesensorcmd , sizeof(_1anglesensorcmd));//发送读取传感器数据指令
                }
                else if(Sensor_Cod == 2)//传感器2角度值 直接传角度 节拍数时间:279
                {
                    Sensor_Cmd_send(_2anglesensorcmd , sizeof(_2anglesensorcmd));//发送读取传感器数据指令
                }
                else if(Sensor_Cod == 3)//获取打捆传感器的数据  节拍数时间:279
                {
                    Sensor_Cmd_send(_3anglesensorcmd , sizeof(_3anglesensorcmd));//发送读取传感器数据指令
                }
                else if(Sensor_Cod == 10)//获取传感器ID  节拍数时间:279
                {
                    Sensor_Cmd_send(_10anglesensorcmd , sizeof(_10anglesensorcmd));//发送读取传感器数据指令
                }
            }
        }
    }  
    void Sensor_User_Send(void)
    {
        uint8_t Open_Sensor = 1;
        if(Open_Sensor)
        {
            Sensor_enble = 1;
        }
        else
        {
            Sensor_enble = 0;
        }
    }
    void Usart1_RX_Analy(void)
    {
        if(Usart1_Type.RX_Usart1_flag == 1)//完成接收
        {    
            char *p;
            p = strchr((char*)Usart1_Type.RX_Usart1_pData,'U');
            EIR_Reply(p);
            CLean_RX_Usart1_pData();//清空GPRS 串口USART2缓存数据
        }
    }
    void Sensor_User_Handle(void)
    {
        Usart1_RX_Analy();
        Sensor_User_Send();
    } 
    void Usart1_User_Handle(void)
    {
        Usart1_User_Receive();
        Usart1_RX_Analy();
        Usart1_User_Send();
    } 
*/

//单片机处理FATFS文件速度很快,串口发送EC20到缓存速度很慢(获取较大的缓存数组加快速度)。
/*
SD卡单独一个线程
1、GPS定位数据解析后存储
2、传感器采集数据 + gps定位数据解析 ==》缓存空间{链表或队列} 存储到SD卡
3、摄像头图片数据获取和解析后存储{分段获取图片数据}
4、GPRS接收数据进行存储


*/
/*
双摄像头单独一个线程//100K
1、配置摄像头参数,2、定时采集图片数据,


*/

/*
GPRS单独一个线程
1、配置GPRS AT指令,2、激活PDP附着网络PING服务器,3、定时检测信号强度和网络状态
1、MQTT连接服务器,2、定时查看MQTT状态,3、MQTT工作数据上传,4、MQTT数据接收。
1、配置语音参数,       2、准备语音播报{语音播报不能收发数据}
1、配置HTTP参数,     2、HTTP上传图片数据{上传期间GPRS不能收发数据}

1、初始化
    GPRS_AT_Init();//初始化GPRS
    
    Audio_playback("\"开机\"");
    GPIOC->BRR = GPIO_Pin_15;//VCCOUTon
    vTaskDelay(4000); 
    LCD_DisplayGB32_32(145,112,BLACK,WHITE,"正在获取机具号");
    while(!get_Sensor_id())//读取机具号传感器
    Special_Model_IDreadSeekfromFlash();//读特殊模式的ID    
    Camera_Configuration_initialization();
    
    if(MQTT_Land()==1)
    //循环测试远程升级                                
    MQTT_POST_version();//上传文件名和版本号
    MQTT_Get_Mode();
    
*/
/*
LCD          一个线程
1、初始化UI界面,2、定时刷新UI界面,3、UI界面数据实时更新

main_test();                 //测试主界面
Test_Color();              //简单刷屏填充测试
Test_FillRec();            //GUI矩形绘图测试
Test_Circle();             //GUI画圆测试
English_Font_test();//英文字体示例测试
Chinese_Font_test();//中文字体示例测试
Pic_test();                    //图片显示示例测试      
osDelay(1);
*/

你可能感兴趣的:(多任务处理,项目架构搭建,STM32)