查看: 4230|回复: 6

[原创] LPC54114Bonus任务--提高部分

[复制链接]
  • TA的每日心情

    2018-2-28 16:09
  • 签到天数: 65 天

    连续签到: 1 天

    [LV.6]常住居民II

    8

    主题

    238

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    488
    最后登录
    2019-9-18
    发表于 2017-8-10 12:04:59 | 显示全部楼层 |阅读模式
    上次拿到板子,做了基本任务,https://www.nxpic.org.cn/module/forum/thread-611550-1-1.html
    之后一直加班,没空搞提高任务,我申请的提高任务,挺简单的,就是用消息地图处理接收到的字符或者字符串,
    进行处理,总的思路是,M0+内核负责收串口字符,M4负责消息地图处理。
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2018-7-31 08:40
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    299

    主题

    876

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14840
    最后登录
    2020-3-1
    发表于 2017-8-10 13:18:16 | 显示全部楼层
    加油~顶一个~楼主百忙之中抽空发帖呱唧呱唧~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-2-28 16:09
  • 签到天数: 65 天

    连续签到: 1 天

    [LV.6]常住居民II

    8

    主题

    238

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    488
    最后登录
    2019-9-18
     楼主| 发表于 2017-8-10 14:58:00 | 显示全部楼层
    效果如下所示,M0+收到a、b、c,M4内核发别打印apple、orange、world。
    1.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-2-28 16:09
  • 签到天数: 65 天

    连续签到: 1 天

    [LV.6]常住居民II

    8

    主题

    238

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    488
    最后登录
    2019-9-18
     楼主| 发表于 2017-8-10 14:59:32 | 显示全部楼层
    本帖最后由 gujiamao 于 2017-8-10 15:01 编辑

    M4内核中,增加如下代码:typedef enum {
        fsm_rt_err          = -1,    //!< fsm error, error code can be get from other interface
        fsm_rt_cpl          = 0,     //!< fsm complete
        fsm_rt_on_going     = 1,     //!< fsm on-going
    } fsm_rt_t;
    typedef struct _msg_t msg_t;
    typedef fsm_rt_t MSG_HANDLER(msg_t *ptMSG);
    struct _msg_t {
        uint8_t chMSG[17];          //!< ???????16????
        MSG_HANDLER *fnHandler;     //!< ??????
    };
    #define NUM_OF_MSG 10 //10 is TBD
    #define UBOUND(__X) (sizeof(__X) / sizeof(__X[0]))
    static msg_t s_tMSGMap[NUM_OF_MSG];
    bool msg_register(msg_t *ptMsg, uint8_t chNum)
    {
        if(NULL == ptMsg || chNum <= NUM_OF_MSG) {
            return false;
        }
        for(uint8_t chIndex = 0; chIndex < chNum; chIndex++) {
            s_tMSGMap[chIndex].fnHandler = ptMsg[chIndex].fnHandler;
            for(uint8_t chAddr = 0; chAddr < sizeof(ptMsg[chIndex].chMSG); chAddr++) {
                s_tMSGMap[chIndex].chMSG[chAddr] = ptMsg[chIndex].chMSG[chAddr];
            }
            //strcpy(s_tMSGMap[chIndex].chMSG, ptMsg[chIndex].chMSG);
        }
        return true;
    }

    static fsm_rt_t msg_apple_handler(msg_t *ptMSG);
    static fsm_rt_t msg_orange_handler(msg_t *ptMSG);
    static fsm_rt_t msg_hello_handler(msg_t *ptMSG);

    //!
    static msg_t s_tMSGMap[] = {
        {"a", &msg_apple_handler},
        {"b", &msg_orange_handler},
        {"c", &msg_hello_handler},
    };
    msg_t tMsgResult;
    msg_t *search_msg_map(uint8_t chByte);

    #define APPLE_HANDLER_RESET_FSM()   \
        do {\
            s_tState = TASK_APPLE_START;\
        } while(0)
    static fsm_rt_t msg_apple_handler(msg_t *ptMSG)
    {
        if(NULL == ptMSG) {
            return fsm_rt_err;
        }
        static enum {
            TASK_APPLE_START = 0,
            TASK_APPLE_TRIGGER,
        } s_tState = TASK_APPLE_START;

        switch(s_tState) {
            case TASK_APPLE_START:
                s_tState = TASK_APPLE_TRIGGER;
            case TASK_APPLE_TRIGGER:
                                                    PRINTF("apple\r\n");
                //SET_EVENT(&s_tTaskATrigger);
                APPLE_HANDLER_RESET_FSM();
                return fsm_rt_cpl;
        }

        return fsm_rt_on_going;
    }
    #define ORANGE_HANDLER_RESET_FSM()   \
        do {\
            s_tState = TASK_ORANGE_START;\
        } while(0)
    static fsm_rt_t msg_orange_handler(msg_t *ptMSG)
    {
        if(NULL == ptMSG) {
            return fsm_rt_err;
        }
        static enum {
            TASK_ORANGE_START = 0,
            TASK_ORANGE_TRIGGER,
        } s_tState = TASK_ORANGE_START;

        switch(s_tState) {
        case TASK_ORANGE_START:
            s_tState = TASK_ORANGE_TRIGGER;
        case TASK_ORANGE_TRIGGER:
                                    PRINTF("orange\r\n");
            //SET_EVENT(&s_tTaskBTrigger);
            ORANGE_HANDLER_RESET_FSM();
            return fsm_rt_cpl;
        }

        return fsm_rt_on_going;
    }
    #define HELLO_HANDLER_RESET_FSM()   \
        do {\
            s_tState = TASK_HELLO_START;\
        } while(0)
    static fsm_rt_t msg_hello_handler(msg_t *ptMSG)
    {
        if(NULL == ptMSG) {
            return fsm_rt_err;
        }
        static enum {
            TASK_HELLO_START = 0,
            TASK_HELLO_TRIGGER,
        } s_tState = TASK_HELLO_START;

        switch(s_tState) {
            case TASK_HELLO_START:
                s_tState = TASK_HELLO_TRIGGER;
            case TASK_HELLO_TRIGGER:
                                                    PRINTF("world\r\n");
                //SET_EVENT(&s_tTaskCTrigger);
                HELLO_HANDLER_RESET_FSM();
                return fsm_rt_cpl;
        }
        return fsm_rt_on_going;
    }

    #define SEARCH_MESSAGE_RESET_FSM()   \
        do {\
            s_tState = SEARCH_MESSAGE_START;\
        } while(0)
    msg_t *search_msg_map(uint8_t chByte)
    {
        static enum {
            SEARCH_MESSAGE_START = 0,
                                    SEARCH_MESSAGE_GET,
            SEARCH_MESSAGE_JUDGE,
        } s_tState = SEARCH_MESSAGE_START;
        static msg_t *s_ptMsg = NULL;
                    static uint8_t s_chCount = 0;
        switch(s_tState) {
            case SEARCH_MESSAGE_START:
                s_tState = SEARCH_MESSAGE_GET;
            case SEARCH_MESSAGE_GET:
                if(s_chCount < UBOUND(s_tMSGMap)) {
                    s_ptMsg = (msg_t *)&s_tMSGMap[s_chCount];
                    s_chCount++;
                } else {
                    s_chCount = 0;
                    s_ptMsg = (msg_t *)&s_tMSGMap[s_chCount];
                }
                                                    s_tState = SEARCH_MESSAGE_JUDGE;
                                    case SEARCH_MESSAGE_JUDGE:
                                                    if(chByte == s_ptMsg->chMSG[0]) {
                                                                    s_chCount = 0;
                                                                    SEARCH_MESSAGE_RESET_FSM();
                                                                    return s_ptMsg;
                                                    } else {
                                                            s_tState = SEARCH_MESSAGE_GET;
                                                    }
        }
        return NULL;
    }

    main中增加:
    #if 1
                                    tMsgResult.chMSG[0] = 0;
                                    tMsgResult = *search_msg_map(g_msg);
                                    if(tMsgResult.chMSG[0]) {
                                                    PRINTF("%c\r\n", tMsgResult.chMSG[0]);
                                                    tMsgResult.fnHandler(&tMsgResult);
                                                    g_msg = 0;
                                    }
                                    #endif

    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-2-28 16:09
  • 签到天数: 65 天

    连续签到: 1 天

    [LV.6]常住居民II

    8

    主题

    238

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    488
    最后登录
    2019-9-18
     楼主| 发表于 2017-8-10 15:02:09 | 显示全部楼层
    M0+将收到新的字符或者字符串,发送到邮箱即可
    while (1)
        {
            delay();
            LED_TOGGLE();
                              ch = GETCHAR();
                                    if(ch) {
                                            PRINTF("Receive from UART:%c\r\n", ch);
                                            PRINTF("Send to UART:");
                                            PUTCHAR(ch);
                                            PRINTF("\r\nWrite to CM4+ mailbox register: %x\r\n", ch);       
                                            MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, ch);
                                    }
        }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-2-28 16:09
  • 签到天数: 65 天

    连续签到: 1 天

    [LV.6]常住居民II

    8

    主题

    238

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    488
    最后登录
    2019-9-18
     楼主| 发表于 2017-8-10 17:33:43 | 显示全部楼层
    二楼的代码可以用EVENT代替直接打印信息,这样handler函数和应用函数(打印)分开了,主函数只需要检测EVENT事件的状态机,甚至是收字符串的时候使用队列,打印字符串的时候也可以用队列,这样避免死等,当然仅仅是使用这个板子的双核功能,体验还是不错的,接下来准备把语音部分搞一搞!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-9-15 08:42
  • 签到天数: 1952 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    1

    主题

    4686

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9405
    最后登录
    2023-9-15
    发表于 2017-8-11 06:49:35 | 显示全部楼层
    参考!!!
    今天天气不错!签到!
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-10 15:20 , Processed in 0.096751 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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