查看: 4178|回复: 1

[原创] 【我要创作】LPC54608系统研究之MOE系统

[复制链接]
  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    连续签到: 1 天

    [LV.10]以坛为家III

    66

    主题

    4900

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6324
    最后登录
    2025-8-6
    发表于 2017-3-11 20:30:47 | 显示全部楼层 |阅读模式

    对于大家来说,MCU的开发要不裸机要不运行嵌入式操作系统,通常来说大家喜欢裸机,裸机更简单一些,也有采用UCOS、FreeRTOS一些常用的操作系统,相对于裸机开发更难一些,本人喜欢研究MCU跑操作系统,最近机缘巧合了解到一个开源操作系统,感觉很好,本人很喜欢,适合移植使用,也可以在作为大家的程序框架。该操作系统是国人开发的操作系统,名称为"MOE"。

    MOE是一个用于8/16/32位MCU多任务事件驱动型的调度系统。MOE的含义为"Minds Of Embedded system",同时也是作者宝贝女儿的小名。

    其MOE特点如下:

    [td]
    描述
    事件驱动
    可变的事件队列长度,支持高优先级事件插队.
    软件定时器
    实用的软件定时器功能,支持回调.
    消息机制
    易用的消息API轻松实现任务间通讯,支持“To All”消息(低RAM消耗).
    调试选项
    灵活的调试选项,每个模块可设置不同的调试信息打印等级;易用的ASSERT.
    Protothread
    应用模块支持Protothread的编写方式.
         该操作系统移植简单,大家只需要其提供“系统毫秒时钟”及“需要时刻轮询的函数(如果有的话)”,把自己的任务注册一下就可以。具体的移植步骤大家自己去MOE http://ianhom.github.io/MOE/就可以了解,这里不做介绍。
         那对于LPC54608如何移植MOE呢,当然我们可以按照说明提供一个系统毫秒时钟,对于LPC54608实际跑的时钟是48M,代码如下:

        void BOARD_BootClockRUN(void)
    {
        POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on so that we can switch to its 12MHz mode temporarily*/
        CLOCK_AttachClk(
                  kFRO12M_to_MAIN_CLK);          /*!< Switch to 12MHz first to ensure we can change voltage without accidentally
                                           being below the voltage for current speed */
        POWER_SetVoltageForFreq(48000000); /*!< Set voltage for core */
        CLOCK_SetFLASHAccessCyclesForFreq(48000000); /*!< Set FLASH waitstates for core */
        CLOCK_SetupFROClocking(48000000);            /*!< Setup CPU to run off FRO 48MHz output*/
        CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);        /*!< Switch main clock to 48MHz */
        SystemCoreClock = 48000000;                  /*!< Update information about frequency */
    }
    所以我们需要根据这个48M时钟配置,函数如下:
    void SysTick_Ms_Int_Init(uint32_t u32Tick)
    {
        SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;  /* Set clock source = core clock */
        SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;    /* Enable systick interrupt      */
        SysTick->LOAD = u32Tick;                      /* Set tick count for 1ms        */
        SysTick->VAL  = 0;
        SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;     /* Enable SysTick                */
        return;   
    }

    uint32_t SysTick_GetSysClk(void)
    {
        return sg_u32SysClk;
    }


    void SysTick_Handler(void)
    {
        volatile uint32_t u32Temp;
        u32Temp = SysTick->CTRL;
        sg_u32SysClk++;
        return;
    }


    #define SYSTICK_CNT_FOR_MS  (48000)    /* Tick count for 1ms */


    实际提供这个SysTick_Ms_Int_Init(SYSTICK_CNT_FOR_MS);就可以了。
    MOE初试化 Moe_Init(SysTick_GetSysClk, 0);
    通过上述代码提供系统运行所需要的系统毫秒时钟。
    其任务代码如下,可以采用PT协程,
    uint8 Task_PT_Demo_Process(uint8 u8Evt, void *pPara)
    {   
        PT_INIT();

        PT_BEGIN();

        /******************************************************************/
        MOE_MANDATORY_INIT();  /* Mandatory init, shout call it here only */
        /******************************************************************/

        while(1)
        {
            TASK_PT_DEMO_LED_On(LED_GREEN);
            PT_DELAY(150);
            TASK_PT_DEMO_LED_Off(LED_GREEN);
            PT_DELAY(150);
        }

        PT_END();

        return SW_OK;

    }
    对于更多的细节大家自己可以根据MOE的资料研究,希望大家可以共同学习使用。











    开心
    回复

    使用道具 举报

    该用户从未签到

    717

    主题

    6376

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25314
    最后登录
    2025-8-27
    发表于 2017-3-13 13:36:24 | 显示全部楼层
    谢谢楼主分享!!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-28 00:46 , Processed in 0.082265 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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