对于大家来说,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的资料研究,希望大家可以共同学习使用。
|