os_core.c

本文详细介绍了RTOS内核uC/OS中的关键函数,包括OSInit、OSIntExit、OSSched等,涉及任务调度、中断处理、任务阻塞与唤醒等操作。同时讲解了时间片轮询、空闲任务管理和任务状态管理等功能,揭示了RTOS内核的工作原理。
摘要由CSDN通过智能技术生成

os_core.c  :OS的核心函数(例如:OSInit()初始化uC , OSSched()任务级别调度 , OSIntExit() 中断级别调度,pend,post,PendList,RdyList管理等)。


void  OSInit (OS_ERR  *p_err):
    调用初始化钩子函数  (设置中断使用的堆栈地址)
    初始化系统全局变量
    初始化Prio、ReadList

void  OSIntExit (void):
    在 OS_CPU_SysTickHandler()中用到了,当中断处理完成之后,并且没有中断嵌套,查看是否有新的高优先级任务,如果有启动任务调度。
        
void  OSSched (void):
    在任务中调用,切换到更高优先级的任务。

void  OSSchedLock (OS_ERR  *p_err):
    当任务调度发生时,阻止任务调度,直到调用了 OSSchedUnlock()。  主要是 OSSchedLockNestingCtr++;

void  OSSchedUnlock (OS_ERR  *p_err):
    主要是OSSchedLockNestingCtr--;  当OSSchedLockNestingCtr > 0时表示调度器还锁着, *p_err = OS_ERR_SCHED_LOCKED; ==0调用OSSched()。


当启动了相同任务优先级时间片轮询(OS_CFG_SCHED_ROUND_ROBIN_EN==1 )
void  OSSchedRoundRobinCfg (CPU_BOOLEAN   en,
                            OS_TICK       dflt_time_quanta,
                            OS_ERR       *p_err):
    决定是否开启时间片轮询,设置任务的默认时间片时间(多少个SysTick),默认为 OSCfg_TickRate_Hz / 10

void  OSSchedRoundRobinYield (OS_ERR  *p_err):
    当一个任务在给定的时间片之前完成了任务,可以调用此函数放弃CPU让给相同优先级的等待运行的任务。    
    个人感觉这个方法与uC不太相符,因为uC要求每个任务都要等待一个事件的发生,应该不会用到此函数。



void  OSStart (OS_ERR  *p_err):
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在基于STM32F103RCT6单片机的μC/OS-II移植中,需要修改OS_CPU_C.C文件,以适配单片机的硬件资源和操作系统的要求。具体修改如下: 1. 定义CPU频率:需要定义CPU的时钟频率,以便操作系统进行时钟节拍的计数。在STM32F103RCT6单片机中,可以定义CPU频率为72MHz,如下所示: ``` #define CPU_CFG_INT_DIS_MEAS_EN DEF_DISABLED #define CPU_CFG_TS_TMR_EN DEF_ENABLED #define CPU_CFG_KAL_FREQ 1000uL #define CPU_CFG_MAX_TASKS 10u #define CPU_CFG_MAX_ISR_NESTING 6u #define CPU_CFG_CRITICAL_METHOD 3u #define CPU_CFG_STK_GROWTH 1u #define CPU_CFG_NAME_EN 0u #define CPU_CFG_TS_32_EN 1u #define CPU_CFG_TS_64_EN 0u #define CPU_CFG_TS_TMR_SIZE 32u #define CPU_CFG_TS_TMR_ISR_SEL 2u #define CPU_CFG_INT_LVL_MEAS_SEL 2u #define CPU_CFG_INT_DIS_MEAS_SEL 2u #define CPU_CFG_STK_SIZE_MIN 64u #define CPU_CFG_FP_EN DEF_DISABLED #define CPU_CFG_VFP_EN DEF_DISABLED #define CPU_CFG_CACHE_MGMT_EN DEF_ENABLED #define CPU_CFG_DATA_CACHE_SIZE 0u #define CPU_CFG_DATA_CACHE_LINE_SIZE 0u #define CPU_CFG_DATA_CACHE_ASSOCIATIVITY 0u #define CPU_CFG_ADDR_SIZE CPU_WORD_SIZE_32 #define CPU_CFG_TS_TMR_PCLK_FREQ BSP_CPU_ClkFreq() #define CPU_CFG_TS_TMR_IN_FREQ CPU_CFG_TS_TMR_PCLK_FREQ #define CPU_CFG_TS_TMR_OUT_FREQ CPU_CFG_TS_TMR_PCLK_FREQ #define CPU_CORE_CLK_FREQ 72000000u #define CPU_AHB_FREQ CPU_CORE_CLK_FREQ #define CPU_APB1_FREQ (CPU_CORE_CLK_FREQ / 2u) #define CPU_APB2_FREQ CPU_CORE_CLK_FREQ ``` 2. 定义堆栈检查:需要定义堆栈检查的函数,以检测任务堆栈是否溢出。在STM32F103RCT6单片机中,可以定义堆栈检查函数如下: ``` void OS_CPU_StackInit (OS_STK *p_stk_base, OS_STK *p_stk_limit, CPU_STK_SIZE stk_size, OS_TASK_PTR p_task) { (void)p_task; (void)stk_size; (void)p_stk_limit; *p_stk_base = (OS_STK)0xE7FFFFFFu; } ``` 需要注意的是,以上修改仅为示例,具体修改需要根据单片机的硬件资源和操作系统的要求进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值