本帖最后由 ttjlc 于 2017-8-16 18:21 编辑
基于Cortex-M0的HR8P506性价比非常高本身芯片资源拥有8K Ram和36K Flash在某些应用上如果加入一个小型的操作系统将会有助于简化软件设计和提高开发效率。
rt-thread是一款国产开源免费的实时操作系统使用简单方便在HR8P506上面移植该系统是个不错的选择。关于该系统的具体介绍可参考官方网站http://www.rt-thread.org/
移植的过程比较简单主要是参考了rtt官方的bsp附件是已经移植好的工程由于手头目标板暂没有将串口引出来所以将CONSOLE屏蔽了实际应用时打开可有助于开发调试。
工程的硬件是基于【HRSDK-GDB-HR8P506】可直接下载测试。
下面是main.c的部分程序主要是初始化启动系统和创建了两个线程其中一个线程等待另一个线程的信号量当收到信号量时翻转LED的状态。
/* includes --------------------------------------------------------------------------------------*/
#include "main.h"
#include "HR8P506.h"
#include "rtthread.h"
#include "lib_gpio.h"
#include "hr8p506_macro.h"
#include "rthw.h"
/* private typedef -------------------------------------------------------------------------------*/
/* private define --------------------------------------------------------------------------------*/
/* private macro ---------------------------------------------------------------------------------*/
/* private variables -----------------------------------------------------------------------------*/
extern int Image$$RW_IRAM1$$ZI$$Limit;
#define HR8P506_SRAM_SIZE 8
#define HR8P506_SRAM_END (0x20000000 + HR8P506_SRAM_SIZE * 1024)
struct rt_semaphore s_tLedSem;
/* private function prototypes -------------------------------------------------------------------*/
static void rt_hw_board_init(void);
static void led_thread_entry(void *pdata);
static void sem_thread_entry(void *pdata);
static void rt_application_init(void);
static void rtthread_startup(void);
/***************************************************************************************************
外 部 函 数
***************************************************************************************************/
int main(void)
{
/* disable interrupt first */
rt_hw_interrupt_disable();
/* startup RT-Thread RTOS */
rtthread_startup();
while (1);
}
/***************************************************************************************************
内 部 函 数
***************************************************************************************************/
/**
* @brief 初始化硬件目标板
* @param none
* @retval none
* @author linxy
* @date 2017/1/22
* @NOTE
*/
static void rt_hw_board_init(void)
{
SysTick_Config( 48000000 / RT_TICK_PER_SECOND );
}
/**
* @brief led线程,等待一个信号量,然后翻转LED
* @param pdata
* @retval none
* @author linxy
* @date 2017/1/22
* @note
*/
static void led_thread_entry(void *pdata)
{
GPIO_InitSettingType GPIO_InitStructure;
SCU_PeripheralClockCmd(SCU_PLCK_GPIO, 1);
GPIO_InitStructure.Dir = GPIO_Direction_Output;
GPIO_InitStructure.DS = GPIO_DS_Output_Normal;
GPIO_InitStructure.Func = GPIO_Reuse_Func0;
GPIO_InitStructure.ODE = GPIO_ODE_Output_Disable;
GPIO_InitStructure.PDE = GPIO_PDE_Input_Disable;
GPIO_InitStructure.PUE = GPIO_PUE_Input_Enable;
GPIO_InitStructure.Signal = GPIO_Pin_Signal_Digital;
GPIO_Init(GPIO_Pin_A6, &GPIO_InitStructure);
pdata = pdata;
while (1) {
rt_sem_take(&s_tLedSem, RT_WAITING_FOREVER);
GPIO_ToggleBit(GPIO_Pin_A6);
}
}
/**
* @brief 时间信号量线程,每0.5秒释放一个信号量
* @param pdata
* @retval none
* @author linxy
* @date 2017/1/22
* @note
*/
static void sem_thread_entry(void *pdata)
{
pdata = pdata;
while (1) {
rt_thread_delay(RT_TICK_PER_SECOND/2);
rt_sem_release(&s_tLedSem);
}
}
/**
* @brief 用户应用初始化
* @param none
* @retval none
* @author linxy
* @date 2017/1/22
* @note
*/
static void rt_application_init(void)
{
rt_thread_t user_thread;
rt_sem_init(&s_tLedSem, "led_sem", 0, RT_IPC_FLAG_FIFO);
/* Create led thread */
user_thread = rt_thread_create("led",
led_thread_entry,
RT_NULL,
256, 19, 20);
if(user_thread != RT_NULL)
rt_thread_startup(user_thread);
/* Create led thread */
user_thread = rt_thread_create("sem",
sem_thread_entry, RT_NULL,
256, 16, 20);
if(user_thread != RT_NULL)
rt_thread_startup(user_thread);
}
/**
* @brief rtt启动,此函数永不返回
* @param none
* @retval none
* @author linxy
* @date 2017/1/22
* @note
*/
static void rtthread_startup(void)
{
/* init board */
rt_hw_board_init();
/* show version */
rt_show_version();
/* init tick */
rt_system_tick_init();
/* init kernel object */
rt_system_object_init();
/* init timer system */
rt_system_timer_init();
#ifdef RT_USING_HEAP
rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)HR8P506_SRAM_END);
#endif
/* init scheduler system */
rt_system_scheduler_init();
/* init application */
rt_application_init();
/* init timer thread */
rt_system_timer_thread_init();
/* init idle thread */
rt_thread_idle_init();
/* start scheduler */
rt_system_scheduler_start();
/* never reach here */
return ;
}
/* end of file -----------------------------------------------------------------------------------*/
|