OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5067|回复: 5

STM32 MDK的一段代码,大神帮忙看看运行原理

[复制链接]

2

主题

7

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-2-28
在线时间
3 小时
发表于 2022-6-28 09:01:16 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 jiaoyubo12 于 2022-6-28 11:26 编辑




现在的问题时这个用发,我用我的开发板跑不起来,会进入硬件错误,我想确定这样用法的正确性,大佬帮忙看看

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-2-28
在线时间
3 小时
 楼主| 发表于 2022-6-28 09:07:36 | 显示全部楼层
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-2-28
在线时间
3 小时
 楼主| 发表于 2022-6-28 09:08:12 | 显示全部楼层
怎么没有截图啊
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-2-28
在线时间
3 小时
 楼主| 发表于 2022-6-28 09:09:58 | 显示全部楼层
本帖最后由 jiaoyubo12 于 2022-6-28 09:50 编辑



static t_err  a_01_GameCtrlMsg(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
        register t_ureg_opt r;
        register t_err err;
        if(nBytes == 0) {
                // 返回帧错误
                return ERR_FrameError;
        }
        err = ERR_NONE;
        r = pFrame->u08[0];
        
        
        return err;
}
/* 0x02: a_OddsMsg: 押分赢分倍率回复 */
static t_err  a_02_OddsMsg(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
        return ERR_NONE;
}
/* 0x03: a_GameResult: 收到分机押分结束 */
static t_err  a_03_GameResult(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
//        SETBITs(g_PlayerWager[iPlayer].Flag, PLAYER_FLGMSK_WagerEnd);
        return ERR_NONE;
}
/* 0x04: a_PlayerPoint: 收到分机回复本局赢利 */
static t_err  a_04_PlayerWinBet(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
//        SETBITs(g_PlayerWager[iPlayer].Flag, PLAYER_FLGMSK_Over);
        return ERR_NONE;
}

/* 接收返回消息 */
/* 0x21: c_InitDataRequest:向主板请求初始数据 */
static t_err  c_21_InitDataRequest(register uint8 iPlayer, register t_frame *pFrame, register t_ureg_opt nBytes)
{
        // 初始数据
        register uint8 *pSend = (uint8 *)&SendBuf;
        register t_ureg_opt i, j;
//        register T_PlayerWager *pPlayerWager;
        t_ureg_opt N;
        t_err err;
        
//        pPlayerWager = &g_PlayerWager[iPlayer];
        // 发送第0段初始化数据
//        ((T_FrmInitData0 *)pSend)->Seg = 0x00;                                                                // 第0段标记
//        ((T_FrmInitData0 *)pSend)->WagerSec = g_Param.GambleParam.WagerSec;        // 押分时长
//        ((T_FrmInitData0 *)pSend)->WagerRate = pPlayerWager->WagerRateIndex;        // 押分倍率
//        ((T_FrmInitData0 *)pSend)->Stake = *((uint24 *)&pPlayerWager->Stake);                                // 赌金
//        err = SendToPlayer(iPlayer, FRM_T_InitDataRequest, (t_frame *)pSend, sizeof(T_FrmInitData0));
        
        // 发送后续各项押分值
        i = 0;
        j = 0;
        while(i < BET_ITEMS)
        {
//                ((T_FrmInitData0 *)pSend)->Seg = ((BET_ITEMS+1)/2 << 4) | ((i >> 1) + 1); // 计算总段数(高四位),当前段号(低四位)
//                N = sizeof(((T_FrmInitData1 *)pSend)->Seg);
                for(j = 0; j< 2; j++)
                {
//                        ((T_FrmInitData1 *)pSend)->Bet[j].index = i+1;                                // 项分项索引
//                        ((T_FrmInitData1 *)pSend)->Bet[j].Bet = pPlayerWager->Bet;// 第j项押分项值
//                        N += sizeof( ((T_FrmInitData1 *)pSend)->Bet[0] );
                        
                        i++;
                        if(i == BET_ITEMS){
                                break;        /* break: for(j = 0; j< 2; j++) */
                        }
                }
//                err = SendToPlayer(iPlayer, FRM_T_InitDataRequest, (t_frame *)pSend, nBytes);
        }
        // 设置分机初始化完成标志
//        SETBITs(pPlayerWager->Flag, PLAYER_FLGMSK_InitOK);
        
        return err;
}


typedef t_err t_frameHandler(register uint8, t_frame *, t_ureg_opt);

static const void *r_0x_HandlerTbl[] =
        {NULL,         a_01_GameCtrlMsg,        a_02_OddsMsg, a_03_GameResult,
        /* 0                        1                                2                                        3        */
        a_04_PlayerWinBet
        /* 4                        5                                6                                7        */
        /* 8                        9                                10                                11        */
        /* 12                        13                                14                                15        */
        };
static const void *r_2x_HandlerTbl[] =
        {NULL,         c_21_InitDataRequest, c_22_WagerEvent, c_23_WagerCtrlMsg,
        /* 0                        1                                2                                3        */
        c_24_BetMsg, c_25_FuncKeyMsg1, NULL,                        NULL,
        /* 4                        5                                6                                7        */
        NULL,                        NULL,                  c_2A_ErrorData
        /* 8                        9                                A                                11        */
        /* 12                        13                                14                                15        */
        };

void CAN1_SWI_Handler (void)
{
        #define _DbgCanMsg_                _DbgPrintf_
        #define _DbgCanMsgLcd_        _DbgLcdPrintf_
        
        // CAN接收到数据后先压入FIFO,然后触发该中断服务对应的软件中断
        static T_CanFrame        CanFrame = {0, };
        t_err err;
        //uint8        DstMAC;
        register uint8        PlayerID;
        register T_FRM_Type        type;
        register uint32 r;
        register void *p;
        
        // 清除中断
        CAN1_SWI_ClrInt();
        
        // 读取CAN帧
        while(1)
        {
                _DbgCanMsg_(( "CAN.SWI:" ));
               
                CanFrame.Data.u32[0] = 0x00000000;
                CanFrame.Data.u32[1] = 0x00000000;
                err = CAN_ReadFrame(&CanFrame);
                if(err != QUEUE_OK)
                {
                        break;                /* break: while(1) */
                }
               
                r = CanFrame.IxR >> FRM_ID_LShitBITn;
                /*                 已由CAN进行硬件过滤,不用再判断
                DstMAC = (r >> FRM_DST_MAC_BITn) & FRM_DST_MAC_Msk;
                if(DstMAC != GET_LOAL_MAC())
                {
                        break;
                }*/
                PlayerID = (r >> FRM_SRC_MAC_BITn) & FRM_SRC_MAC_Msk;        /* SrcMAC已进行过滤,不用判断 */
                PlayerID--;                                                                                                /* 转换为以零开始的index */
                type = (r >> FRM_ID_TYPE_BITnL) & FRM_ID_TYPE_Msk;
                _DbgCanMsg_(( "ID:%08X,[%u]:%02X,%02X %02X\r\n", r, PlayerID, type, CanFrame.Data.u08[0], CanFrame.Data.u08[1] ));
                _DbgCanMsgLcd_(( 0,0, "ID[%u]:%02X ", PlayerID, type ));
                _DbgCanMsgLcd_(( 1,0, "%02X %02X ", CanFrame.Data.u08[0], CanFrame.Data.u08[1] ));
                if(PlayerID < FRM_PLAYER_MAC_BASE)
                {
                        _DbgCanMsg_(( "CIdErr0!\r\n" ));
                        return;
                }
                PlayerID -= FRM_PLAYER_MAC_BASE;
                if(PlayerID >= MAX_PLAYER)
                {
                        _DbgCanMsg_(( "CIdErr1!\r\n" ));
                        
                        return;
                }
               
//                if(type == FRM_T_WagerEvent)
//                {
//                        // 押分消息优先处理
//                        err = c_22_WagerEvent(PlayerID, (t_frame *)&CanFrame.Data,
//                                                                CanFrame.DTxR & 0xFF);
//                }
//                else
                {
                        p = NULL;
                        r = type & 0xF0;
                        type &= 0x0F;
                        if((r == 0x20) && (type < lenof(r_2x_HandlerTbl)))
                        {
                                p = r_2x_HandlerTbl;
                        }
                        else if((r == 0x20) && (type < lenof(r_0x_HandlerTbl)))
                        {
                                p = r_0x_HandlerTbl;
                        }
                        if(p != NULL)
                        {
                                err = ((t_frameHandler *)p)(PlayerID, (t_frame *)&CanFrame.Data,
                                                                                        CanFrame.DTxR & 0xFF);

                        }else{
                                err = ERR_UndefPlayerData;
                        }
                }
        }
        
}



回复

使用道具 举报

2

主题

7

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-2-28
在线时间
3 小时
 楼主| 发表于 2022-6-28 09:12:09 | 显示全部楼层
本帖最后由 jiaoyubo12 于 2022-6-28 09:49 编辑

只知道r_2x_HandlerTbl  r_0x_HandlerTbl是两个函数指针数组,t_frameHandler  是个函数指针,下面贴了一部分函数指针的实现,想知道这种用法为什么目前用不了有什么问题吗,
回复

使用道具 举报

3

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2021-12-22
在线时间
34 小时
发表于 2022-6-29 10:21:26 | 显示全部楼层
把t_frameHandler *去掉试试
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 19:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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