基于优先级调度的嵌入式实时操作系统内核详解_第1页
基于优先级调度的嵌入式实时操作系统内核详解_第2页
基于优先级调度的嵌入式实时操作系统内核详解_第3页
基于优先级调度的嵌入式实时操作系统内核详解_第4页
基于优先级调度的嵌入式实时操作系统内核详解_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页基于优先级调度的嵌入式实时操作系统内核详解

今日分享参加(瑞萨)RA(MCU)(创意)氛围赛的选手项目——基于优先级的(RTOS)内核。本项目为基于优先级调度的(嵌入式)实时操作系统内核,其中调度部分使用固定可抢占的优先级调度机制;提供了可移植(接口)以便适配不同架构的(cpu);重写了更简易更轻量级的部分库函数,比如标准输入输出以及字符串相关操作;除内核外还提供部分组件,包括一个简易的shell程序以及设备驱动框架。具体的操作我们一起来看看讲解吧!

一、简介

1.1项目简介

(Sim)pleRTOS(catOS)是我大学实习期间为了学习RTOS编写的一个简单的内核,主要调度方式基于优先级抢占,该项目重构了两次,故内容和功能有所不同,(最新版)本仅保留了固定优先级调度方式。

本次项目内容为将该内核对野火的瑞萨启明6M5开发板进行适配,并编写简单的demo验证正确性。如果有什么错误请大家批评指正。(文末有项目(资料)链接可供参考)

1.2开发板简介

官网特性介绍如下:

支持TrustZone的200MHz(Arm)Cortex-M33

安全(芯片)功能

1MB-2MB闪存、448KB支持奇偶校验的S(RAM)和64KBECCSRAM

具有后台运行能力的双区闪存,以及存储块交换功能

8KB数据闪存,提供与EEP(ROM)类似的数据存储功能

100引脚封装至176引脚封装

带有专用(DMA)的(以太网)(控制器)

(电容)(触摸按键)感应单元

高速和全速(USB)2.0

(CAN)FD(也支持CAN2.0B)

Qua(dSP)I和OctaS(PI)

SCI多功能串口((UART)、简单SPI、简单(I2C))

SPI/I2C多主接口

(SD)HI和MMC

二、适配内核

2.1可移植接口概览

需要实现的可移植接口包括以下部分

左右滑动查看

/***@brief(硬件)初始化*/voidcat_hw_init(void);/***@brief开始调度**/voidcatos_start_sched(void);/***@brief上下文切换**///voidcat_hw_con(te)xt_switch(void);/***@brief上下文切换**@param

from_task_sp_(ad)dr上一个任务tcb中堆栈指针变量的*地址**@param

to_task_sp_addr

下一个任务tcb中堆栈指针变量的*地址**/voidcat_hw_context_switch(cat_uint32_tfrom_task_sp_addr,cat_uint32_tto_task_sp_addr);/***@brief切换到第一个任务的上下文**@param

fi(rs)t_task_sp_addr

要切换的任务tcb中堆栈指针变量的*地址**/voidcat_hw_context_switch_to_first(cat_uint32_tfirst_task_sp_addr);/***@brief关中断进临界区**@returncat_uint32_t*/cat_uint32_tcat_hw_irq_disable(void);/***@brief开中断出临界区**@paramstatus*/voidcat_hw_irq_enable(cat_uint32_tstatus);/***@brief栈初始化**@paramtask_entry

任务入口函数地址*@paramparameter

参数*@paramst(ac)k_addr

栈起始地址*@paramexit

任务退出函数地址*@returncat_uint8_t*

初始化后的栈顶地址*/cat_uint8_t*cat_hw_stack_init(void*task_entry,void*parameter,cat_uint8_t*stack_addr,void*exit);

2.2硬件初始化

在硬件初始化中主要是设置系统(时钟)中断频率,初始化时设置时钟中断为关闭状态。

左右滑动查看

/***@brief硬件初始化*/voidcat_hw_init(void){/*设置系统时钟中断频率为100Hz(每秒100次)*/cat_set_syst(ic)k_period(CATOS_SYSTICK_MS);}/***@brief初始化时钟中断**@paramms每个(ti)ck的时间(ms)*/staticvoidcat_set_systick_period(cat_uint32_tms){cat_uint32_terr=0;cat_uint32_tIT_Period=0;IT_Period=ms*SystemCoreClock/1000;//err=SysTick_Config(IT_Period);/*如果设定的周期太离谱就停在这*/if((IT_Period-1UL)>SysTick_LOAD_RELOAD_Msk){err=1;}assert(0==err);SysTick->LOAD=(uint32_t)(IT_Period-1UL);/*设置重装载(寄存器)*/NVIC_SetPriority(SysTick_IRQn,(1ULVAL=0UL;/*设置计数器装载值*/SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|/*设定为内核时钟FCLK*/SysTick_CTRL_TICKINT_Msk|/*设定为systick计数器倒数到0时触发中断*/~SysTick_CTRL_ENABLE_Msk;/*关闭(定时器)中断,若创建任务则在catos_start_sched()中开启该中断*/}

2.3开始调度与切换到第一个任务的上下文

开始调度需要从就绪表中获取最高优先级任务并设置为当前任务,并且在恢复第一个任务上下文之前需要打开时钟中断并初始化pendsv中断以保证调度的正常工作。

注:这里暂时没有对不使用fpu的情况适配,参考(FreeRTOS)的可移植接口实现。

左右滑动查看

/***@brief开始调度**/voidcatos_start_sched(void){cat_uint32_ttmp_reg=0;struct_cat_task_t*first_task=NULL;/*获取最高优先级任务*/first_task=cat_sp_task_highest_ready();/*因为是第一个任务,不用像调度时判断是否和上一个任务一样,直接赋值给当前任务就行*/cat_sp_cur_task=first_task;/*允许调度(打开调度锁,并且不在该处进行调度)*/cat_sp_task_sched_enable_without_sched();/*开启时钟中断*/SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;/*设置pendsv中断优先级*/tmp_reg=MEM32(NVIC_SHPR3);tmp_reg|=NVIC_PENDSV_PRI;MEM32(NVIC_SHPR3)=tmp_reg;/*切换到第一个任务*/cat_hw_context_switch_to_first((cat_uint32_t)}/***@brief切换到第一个任务的上下文**/voidcat_hw_context_switch_to_first(void){__enable_irq();__ISB();/*各个寄存器地址*/__asmvolatile(".equSCB_ICSR,0xE000ED04"//中断控制寄存器".equSCB_VTOR,0xE000ED08"//中断向量表偏移寄存器".equICSR_PENDSVSET,0x10000000"//pendsv触发值".equSHPR3_PRI_14,0xE000ED22"//系统异常handler优先级寄存器3(PendSV).".equPRI_LVL_PENDSV,0xFF"//pendsv优先级(最低).".equSHPR3_PRI_15,0xE000ED23"//系统异常handler优先级寄存器3(Systick)."ldrr1,=cat_context_to_task_sp_ptr""strr0,[r1]"#if__FPU_USED//#error"__FPU_USED"/*清除control寄存器的(FPC)A*/"mrsr2,control"/*read*/"bicr2,r2,#0x04"/*modify*/"msrcontrol,r2"/*write-back*/#else#error"mustusefpu"#endif/*将变量cat_context_from_task_sp_ptr设置为0*/"ldrr1,=cat_context_from_task_sp_ptr""movr0,#0""strr0,[r1]""movr4,#0x1234"/*触发pendsv中断,允许中断后会立即进入pendsv切换*/"ldrr0,=SCB_ICSR""ldrr1,=ICSR_PENDSVSET""strr1,[r0]"/**(SCB_ICSR)="ICSR_PENDSVSET*//*不会到达这里*/"dsb""isb""svc0");}

2.4上下文切换

上下文切换使用pendsv中断进行,主要工作为保存当前任务堆栈和寄存器以及恢复下一个任务的堆栈和寄存器。

左右滑动查看

/***voidcat_hw_context_switch(void)*触发pendsv中断进行任务切换(pendsv的优先级在开始第一个任务时已经设置)*/

.globalcat_hw_context_switch

.typecat_hw_context_switch,%functioncat_hw_context_switch:

/*将两个任务的堆栈指针变量的*地址*加载到临时变量中*/

/*cat_context_from_task_sp_ptr=}

2.5临界区的开关中断

开关中断主要是对primask的操作,和cortex-m3差不多,比较简单。

左右滑动查看

/***cat_uint32_tcat_hw_irq_disable(void)*关中断方式进入临界区*primask-->r0*/

.globalcat_hw_irq_disable

.typecat_hw_irq_disable,%functioncat_hw_irq_disable:

mrsr0,primask

/*ret=primask*/

cpsidI

/*disableirq*/

bxlr

/*returnret*//***voidcat_hw_irq_enable(cat_uint32_tstatus)*开中断方式出临界区*r0-->status*/

.globalcat_hw_irq_enable

.typecat_hw_irq_enable,%functioncat_hw_irq_enable:

msrprimask,r0

/*primask=status*/

bxlr

2.6任务栈初始化

在任务创建时需要根据任务的相关信息对任务栈帧中各项进行初始化,包括设置psr寄存器、任务入口地址、退出函数地址和任务参数。

需要特别注意的是cortex-m33还需要正确设置psplim等寄存器。

左右滑动查看

/***@brief栈初始化**@paramtask_entry

任务入口函数地址*@paramparameter

参数*@paramstack_addr

栈起始地址*@paramexit

任务退出函数地址*@returncat_uint8_t*

初始化后的栈顶地址*/cat_uint8_t*cat_hw_stack_init(void*task_entry,void*arg,cat_uint8_t*stack_addr,void*exit_func){

struct_stack_frame*stack_frame;

cat_uint32_t

*stack;

cat_uint32_t

i;

/*先加上4字节再8字节向下取整对齐(相当于四舍五入)*/

stack=stack_addr+sizeof(cat_uint32_t);

stack=(cat_uint8_t*)CAT_ALIGN_DOWN((cat_uint32_t)stack,8);

/*taskcontextsaved/*xPSR:EPSR.T=1,thumbmode

*/

*(--stack)=(cat_uint32_t)task_entry;

/*EntryPoint*/

*(--stack)=(cat_uint32_t)exit_func;/*R14(LR)

*/

*(--stack)=(cat_uint32_t)0x12121212L;/*R12

*/

*(--stack)=(cat_uint32_t)0x03030303L;/*R3

*/

*(--stack)=(cat_uint32_t)0x02023202L;/*R2

*/

*(--stack)=(cat_uint32_t)0x01010101L;/*R1

*/

*(--

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论