ucos原理

ucos原理,第1张

ucos-ii是一个可剥夺型内核的实时 *** 作系统,以stm32来说,使用系统滴答定时器,定时产生一个时镇穗钟节拍,来推动任务的调度,管理,切换等。

关于系统大概的运行原理

2.当产生一个时钟节拍时,如果有比当前运行任务优先级更高的任务就绪,那么优先级(“优先级”为0时优先级最高)高的任务抢占CPU,CPU保存现场环境,放入该任务堆栈中。再将优先级高的任务的堆栈中的现场环境取出来,写入CPU寄存器中。(CPU中的寄存器暂时还没有仔细去研究)。当这个任务执行进入延时,或是要等待某个时间或者信号量。那么它将放弃CPU的使用权,系统会从任务就绪表中,把优先级最高的且就绪状态的任务赋予CPU的使用权。至此来推动整个系统,调度所悔旅告有的任务。

不发生中断时UCOS系统时间与任务的切换

①.假设当前运行的任务是低优先级的任务,CPU程序寄存器中存在的一些寄存器都是低优先级的任务

②当程序运行到检测到高优先级的任务进入就绪状态的时候,此时CPU发送一些命令,把CPU当前的一些程序寄存器的内容复制到低优先级任务的堆栈中。也就是1过程。

③.此时通过刚刚的就绪表的机制,可以从程序中得到最高优先级的任务,也就是2过程=

④碧明.最后的过程3就是把刚刚的高优先级任务的堆栈指针复制到CPU的程序寄存器当中,实现任务的切换。

当有中断时,UCOS系统的执行原理

当程序正在执行一个中断服务函数时,发生一个系统滴答中断,因为系统滴答定时器的优先级高,所以会中断这个中断服务函数执行任务切换。而有些时候,中断时不能延时的。例如接收数据时,会发生接收错误。造成严重的后果。

这时,就有下图中的 *** 作,可以避免。

PendSV异常(我称它为中断)编程为最低的优先级中断。如果某个中断正在执行,而系统滴答抢占了它,那么这个中断将悬起一个PendSV中断,来缓期执行任务切换。

UCOS的任务切换时间可以在os_cfg.h中去设置OS_TICKS_PER_SEC宏UCOS任务数等配置也可以在该文件中去寻找。

UCOS-II主要提供服务

内存管理

多任务管理

外围资源管理

关于Make 与编译

书中有讲这一块,所以我也记录下我的理解

由于我平时都用keil这样的集成开发环境,之前也有学习过一段时间的linux,但是对编译,makefile这些理解的还是不是很好。

编辑makefile 来将源文件和包含的头文件编译成需要的.obj文件,然后再将这些.obj文件链接成,想要生成的程序。关于makefile好像每一种编译器都有自己的makefile规则和命令,因为以前学习GCC编译器和现在书上看到的BCC编译器写的makefile好像不太一样。我也没有去深究。

所以还是集成开发环境好,工具还是怎么方便怎么来。需要学习的原理的时候再去理解,实际的应用中用自己写的Makefile去编译文件怕是石乐志哦。

UCOS的任务

任务三要素(我理解的)

任务控制块

OSTaskCreate((void()(void))start_task,

//任务函数

(void*)0,

//传递给任务函数的参数

(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],

//任务堆栈的栈顶

(INT8U)START_TASK_PRIO,

//任务的优先级

主要包含了任务的栈顶地址,

如果处理器的堆栈是高地址向下生长的那么栈顶地址

通过单步调试,基本已经能确激指定是死在明肆配下面这段汇编代码里了,但是不知道为何,谁能解释一下?

代码:雹旁

os_switch_task1:

next = current

IF (TIMESHARING <>0)

SETB ?RTX_TS_DELAY Delay Task Switching

ENDIF

MOV A,?RTX_CURRENTTASK

MOV R7,A

while (1) {

RL A

ADD A,#?RTX?TASKSTATE?S+1

MOV R0,A

?C0001:

if (++next == MAXTASKN+1) next = 0

INC R7

INC R0

INC R0

IF (CPU_IDLE_CODE)

MOV A,R7

CJNE A,?RTX_CURRENTTASK,NoIDLE

JBC ?RTX_ISR_SIG,NoIDLE

CPU_IDLE CPU sleep

NoIDLE:

ENDIF

CJNER7,#?RTX_MAXTASKN+1,?C0003

MOV R7,#0

MOV R0,#?RTX?TASKSTATE?S+1

?C0003:

if (STATE[next].st &K_READY) break

MOV A,@R0

JNB ACC.B_READY,?C0001

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12285774.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存