- 打卡等级:偶尔看看I
- 打卡总天数:16
- 最近打卡:2025-04-30 08:41:32
荣誉版主
- 积分
- 12882
|
发表于 2024-5-11 16:29:08
|
显示全部楼层
(1)回答正确,你最近给出的作品 uC/OS-II@STC8H确实是一个“能在高优先级零延迟中断”中调用系统服务的RTOS。祝贺你的这个作品成为本论坛“零中断延迟”RTOS的第二匹黑马。
(2)这是你的测试程序中的测试中断ISR:
void Timer3_ISR_Handler (void) interrupt 19{
T4T3M &= ~0x08; //定时器3停止计数
IE2 &= ~0X20; //关闭定时器3中断
P00 = ~P00;
P01 = 1; //开始唤醒任务
OSTaskResume_FROM_ISR(APP_CFG_START_TASK_PRIO);
}
其中这个在中断里的语句“OSTaskResume_FROM_ISR(APP_CFG_START_TASK_PRIO);”就是调用系统服务功能实现唤醒最高优先级的任务的,这就是赤裸裸的“中断里”调用呀。
(3)为了实现功能,你特地在uC/OS-II的系统内核文件“os_task.c”里新增加了这个在中断内使用的系统服务
INT8U OSTaskResume_FROM_ISR (INT8U prio)FunctionProperties
{
OS_TCB *ptcb;
#if OS_CRITICAL_METHOD == 3u /* Storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
#if OS_ARG_CHK_EN > 0u
if (prio >= OS_LOWEST_PRIO) { /* Make sure task priority is valid */
return (OS_ERR_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
ptcb = OSTCBPrioTbl[prio];
if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_RESUME_PRIO);
}
if (ptcb == OS_TCB_RESERVED) { /* See if assigned to Mutex */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_NOT_EXIST);
}
if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended */
ptcb->OSTCBStat &= (INT8U)~(INT8U)OS_STAT_SUSPEND; /* Remove suspension */
if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) == OS_STAT_RDY) { /* See if task is now ready */
if (ptcb->OSTCBDly == 0u) {
OSRdyGrp |= ptcb->OSTCBBitY; /* Yes, Make task ready to run */
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
OS_TRACE_TASK_READY(ptcb);
OS_EXIT_CRITICAL();
if (OSRunning == OS_TRUE) {
OS_TRACE_TASK_RESUME(ptcb);
OS_Sched_FROM_ISR(); /* Find new highest priority task */
}
} else {
OS_EXIT_CRITICAL();
}
} else { /* Must be pending on event */
OS_EXIT_CRITICAL();
}
return (OS_ERR_NONE);
}
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_NOT_SUSPENDED);
}
其中调用的是中断内的任务切换函数“OS_Sched_FROM_ISR(); ”,这就是赤裸裸的从内核开始了“在中断内进行系统功能的调用”的设计。
(4)并且,你增加的不是一个,而是新增加了一组供中断内调用的常用的系统功能服务:
* 针对所有需要中断调用并且会引起任务切换的OS服务,移植版本提供了额外的中断调用版本,以下是新增中断服务的函数.
INT8U OSTaskSuspend_FROM_ISR (INT8U prio)FunctionProperties;
INT8U OSTaskResume_FROM_ISR (INT8U prio)FunctionProperties;
INT8U OSTaskChangePrio_FROM_ISR (INT8U oldprio,INT8U newprio)FunctionProperties;
INT8U OSTimeDlyResume_FROM_ISR (INT8U prio)FunctionProperties;
INT8U OSSemPendAbort_FROM_ISR (OS_EVENT *pevent, INT8U opt, INT8U *perr)FunctionProperties;
INT8U OSSemPost_FROM_ISR (OS_EVENT *pevent)FunctionProperties;
OS_FLAGS OSFlagPost_FROM_ISR (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *perr)FunctionProperties;
INT8U OSMboxPostOpt_FROM_ISR (OS_EVENT *pevent, void *pmsg, INT8U opt)FunctionProperties;
INT8U OSMboxPost_FROM_ISR (OS_EVENT *pevent, void *pmsg)FunctionProperties;
INT8U OSMboxPendAbort_FROM_ISR (OS_EVENT *pevent, INT8U opt, INT8U *perr)FunctionProperties;
INT8U OSQPendAbort_FROM_ISR (OS_EVENT *pevent, INT8U opt, INT8U *perr)FunctionProperties;
INT8U OSQPost_FROM_ISR (OS_EVENT *pevent, void *pmsg)FunctionProperties;
INT8U OSQPostFront_FROM_ISR (OS_EVENT *pevent, void *pmsg)FunctionProperties;
INT8U OSQPostOpt_FROM_ISR (OS_EVENT *pevent, void *pmsg, INT8U opt)FunctionProperties;
见你的主贴的19楼介绍:《自己用的 uC/OS-II@STC8H, 51核移植版本》
(https://www.stcaimcu.com/forum.p ... page%3D1&page=1)
(5)经过这些操作,你已经成功地将uC/OS-II移植到STC8H单片机上(本不具备RTX4/5需要的片上中断条件),必将会成为一个比CosyOS-II还强的“零中断延迟”的STC单片机RTOS。
强就强在uC/OS-II是一个主流的单片机RTOS,可以移植很多开源库在上面,比如本尊在本论坛已经移植的“uGFX”图形接口和“znFAT”文件系统,这些是CosyOS-II一时半会难以做到的。
|
|