硬汉嵌入式论坛

 找回密码
 立即注册
查看: 536|回复: 3
收起左侧

[有问必答] STM32407IGT6 如何实现循环消息缓存

[复制链接]

12

主题

22

回帖

58

积分

初级会员

积分
58
发表于 2023-4-22 07:54:20 | 显示全部楼层 |阅读模式
硬汉哥,编程厉害。下面程序是别人写的。我看不了底层。
想请教一下,循环消息缓存这个交给中断去完成FIFO么?
具体是怎么实现的。感觉他这个写很精妙。
比如:下面这个判断函数,在后台通过中断函数,调用FIFO给缓存区不停写入消息。就可以实现是吧。
        比如:当哪个消息更新了,就将那个消息的标志位置1.代表有新数据。这个样子实现么?
  if (LibAppVars.InputDataMsg[i].Flag > 0)  // 判断有新数据
        {
            flag++;
            APP_UserProcessData((LIBAPP_INPUTDATA_MSG *)&LibAppVars.InputDataMsg[i].Flag);  // 调用用户处理函数  
        }



typedef struct
{
    INT16U  Flag;                   //2 标志
    INT8U        Type;                        //1 数据类型
    INT8U        id;                                 //1        数据id
    INT16U        len;                        //2        数据长度
    void    *pData;                 //4        数据指针
}LIBAPP_INPUTDATA_MSG;
//-----------------------------------------------------------------------------------------------------------
typedef struct
{
   LIBAPP_REGISTER Register;   // 注册函数变量

    LIBAPP_CONFIG_PARA  Para;   // 系统配置参数

    LIBAPP_INPUTDATA_MSG  InputDataMsg[LIBAPP_INPUTDATA_MSG_SIZE];      // 系统输入数据信息缓存
    INT16U InputDataMsg_ID;                                             // 系统输入数据ID
    LIBAPP_EVENTCTRL_MSG  EventCtrlMsg[LIBAPP_EVENTCTRL_MSG_SIZE];      // 系统控制事件信息缓存
    INT16U EventCtrlMsg_ID;                                             // 系统控制事件ID
    LIBAPP_OUTPUTDATA_MSG OutputDataMsg[LIBAPP_OUTPUTDATA_MSG_SIZE];    // 系统输出数据信息缓存
    INT16U OutputDataMsg_ID;                                            // 系统输出数据ID

    LIBAPP_FILECTRL_MSG   FileCtrlMsg[LIBAPP_FILECTRL_MSG_SIZE];        // 文件控制信息缓存
    INT16U FileCtrlMsg_ID;                                              // 文件控制事件ID

    LIBAPP_IRQDATA_MSG  IRQDataMsg[LIBAPP_IRQDATA_MSG_SIZE];            // 中断数据信息缓存
    INT8U IRQDataMsg_ID;

}LIBAPP_VARS;       
//-----------------------------------------------------------------------------------------------------------------------
/***********************************************************************************
* Function: APP_ProcessData;
*
* Description: 数据处理函数;
*
* Input:  none;
*
* Output: none;
*                         
* Return: none;
*
* Note:   本函数由无操作系统的MainApp调用;
************************************************************************************/
void APP_ProcessData(void)
{
    INT16U i;
    INT8U flag = 0;

    for (i=0; i<LIBAPP_INPUTDATA_MSG_SIZE; i++)   // 循环判定消息缓存是否有新数据
    {
        if (LibAppVars.InputDataMsg[i].Flag > 0)  // 判断有新数据
        {
            flag++;
            APP_UserProcessData((LIBAPP_INPUTDATA_MSG *)&LibAppVars.InputDataMsg[i].Flag);  // 调用用户处理函数  
        }
    }
    if (flag > 0)
    {
        User_MainApp();               // 调用用户主处理程序
    }
}   
//---------------------------------------------------------------------------------------------
void APP_UserProcessData(LIBAPP_INPUTDATA_MSG *pInputDataMsg)
{
    switch(pInputDataMsg->Type)
    {
        case LIBAPP_DATA_UART_TYPE:                   // UART接收的数据类型
            Uart_DataProcess(pInputDataMsg);          // 对UART接收数据做处理                    
            break;

        #if ((CAN1_EN > 0)||(CAN2_EN > 0))
        case LIBAPP_DATA_CAN_TYPE:                    // CAN接收的数据类型
            CAN_DataProcess(pInputDataMsg);           // 对CAN接收数据做处理                  
            break;
        #endif

        #if (LWIP_EN > 0)
        #if (LWIP_TCP_SERVER_EN > 0)
        case LIBAPP_DATA_TCP_SERVER_TYPE:             // TCP服务器模式数据类型
            NET_TCPServerDataProcess(pInputDataMsg);  // 对TCP服务器接收数据做处理                  
            break;
        #endif
        #if (LWIP_UDP_SERVER_EN > 0)
        case LIBAPP_DATA_UDP_SERVER_TYPE:             // UDP服务器模式数据类型
            NET_UDPServerDataProcess(pInputDataMsg);  // 对UDP服务器接收数据做处理                  
            break;
        #endif
        #if (LWIP_TFTP_SERVER_EN > 0)
        case LIBAPP_DATA_TFTP_SERVER_TYPE:            // TFTP服务器模式数据类型
            NET_TFTPServerDataProcess(pInputDataMsg); // 对TFTP服务器接收数据做处理                  
            break;
        #endif
        #if (LWIP_TCP_CLIENT_EN > 0)
        case LIBAPP_DATA_TCP_CLIENT_TYPE:             // TCP客户端模式数据类型
            NET_TCPClientDataProcess(pInputDataMsg);  // 对TCP客户端接收数据做处理                  
            break;
        #endif
        #if (LWIP_UDP_CLIENT_EN > 0)
        case LIBAPP_DATA_UDP_CLIENT_TYPE:             // UDP客户端模式数据类型
            NET_UDPClientDataProcess(pInputDataMsg);  // 对UDP客户端接收数据做处理                  
            break;
        #endif
        #endif  

        #if (WIFI_EN > 0)
        case LIBAPP_DATA_WIFI_TYPE:                   // WIFI数据类型
            WIFI_DataProcess(pInputDataMsg);          // 对WIFI接收数据做处理         
            break;
        #endif

        #if (KEY_EN > 0)
        case LIBAPP_DATA_KEY_TYPE:                    // 按键数据类型
            KEY_DataProcess(pInputDataMsg);           // 对按键数据做处理         
            break;
        #endif

        #if (DI_EN > 0)
        case LIBAPP_DATA_DI_TYPE:                     // DI数据类型
            DI_DataProcess(pInputDataMsg);            // 对DI数据做处理         
            break;
        #endif
        #if (SW_EN > 0)                                
        case LIBAPP_DATA_SW_TYPE:                    // SW拨码开关数据类型
            SW_DataProcess(pInputDataMsg);           // 对SW数据做处理         
            break;
        #endif   

        #if (ADC_EN > 0)                              
        case LIBAPP_DATA_ADC_TYPE:                   // ADC数据类型
            ADC_DataProcess(pInputDataMsg);          // 对ADC数据做处理         
            break;
        #endif         
        #if (FCLK_EN > 0)                           
        case LIBAPP_DATA_FCLK_TYPE:                  // FCLK数据类型
            FCLK_DataProcess(pInputDataMsg);         // 对FCLK数据做处理           
            break;
        #endif  
        #if (PWM_EN > 0)                           
        case LIBAPP_DATA_PWM_TYPE:                  // PWM数据类型
            PWM_DataProcess(pInputDataMsg);         // 对PWM数据做处理           
            break;
        #endif  
        #if (MODBUS_EN > 0)                          
        case LIBAPP_DATA_MODBUS_TYPE:                // MODBUS数据类型
            Modbus_DataProcess(pInputDataMsg);       // 对MODBUS数据做处理            
            break;
        #endif  
        #if ((USB_DEVICE_EN > 0)&&(USB_VCP_EN > 0))  // 虚拟串口使能
        case LIBAPP_DATA_USB_TYPE:                   // USB数据类型
            USB_DataProcess(pInputDataMsg);          // 对USB数据做处理         
            break;
        #endif           
        #if (DEVICE_EN > 0)
        case LIBAPP_DATA_DEVICE_TYPE:                // 外部器件(传感器)类型数据
            Device_DataProcess(pInputDataMsg);       // 对外部器件(传感器)数据做处理            
            break;
        #endif

        default:
            break;
    }     
    pInputDataMsg->Flag = 0;   // 清除数据标志
}

回复

使用道具 举报

10

主题

90

回帖

120

积分

初级会员

积分
120
发表于 2023-4-24 01:00:08 | 显示全部楼层
数据结构里面介绍了很多。。。什么栈,队,树!!!看自己选择和需求!!!
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2023-4-24 19:30:19 | 显示全部楼层
消息队列就可以了,都上RTOS了,都带的啊
回复

使用道具 举报

12

主题

22

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2023-4-29 22:39:02 | 显示全部楼层
yklstudent 发表于 2023-4-24 19:30
消息队列就可以了,都上RTOS了,都带的啊

好的,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 20:40 , Processed in 0.237719 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表