什么是UCOS *** 作系统?

什么是UCOS *** 作系统?,第1张

u C / O S 是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时 *** 作系统。\x0d\x0a\x0d\x0aμC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。\x0d\x0a\x0d\x0aμC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。\x0d\x0a\x0d\x0a严格地说uC/OS-II只是一个实时 *** 作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。\x0d\x0a\x0d\x0auC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。\x0d\x0a\x0d\x0a任务管理\x0d\x0a\x0d\x0auC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以培神使用的任务数有56个。\x0d\x0a\x0d\x0auC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。\x0d\x0a\x0d\x0a系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,改任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,改任务负责统计当前cpu的利用率。\x0d\x0a\x0d\x0a时间管理\x0d\x0a\x0d\x0auC/OS-II的时间管理是通过定时中断来实现的,该定芦薯时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。\x0d\x0a\x0d\x0auC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换陪中者函数,系统时间函数。\x0d\x0a\x0d\x0a内存管理\x0d\x0a\x0d\x0a在ANSI C中是使用malloc和free两个函数来动态分配和释放内存。但在嵌入式实时系统中,多次这样的错作会导致内存碎片,且由于内存管理算法的原因,malloc和free的执行时间也是不确定。\x0d\x0a\x0d\x0auC/OS-II中把连续的大快内存按分区管理。每个分区中包含整数个大小相同的内存块,但不同分区之间的内存快大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。\x0d\x0a\x0d\x0a任务间通信与同步\x0d\x0a\x0d\x0a对一个多任务的 *** 作系统来说,任务间的通信和同步是必不可少的。uC/OS-II中提供了4中同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,发送,查询的接口用于实现进程间的通信和同步。\x0d\x0a\x0d\x0a任务调度\x0d\x0a\x0d\x0auC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。\x0d\x0a\x0d\x0auC/os-II的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,uC/OS-II规定所有任务的优先级不同,因为任务的优先级也同时唯一标志了该任务本身。\x0d\x0a\x0d\x0a任务调度将在以下情况下发生:\x0d\x0a\x0d\x0a1) 高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。\x0d\x0a\x0d\x0a2) 高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。\x0d\x0a\x0d\x0a这两种调度方式在uC/OS-II的执行过程中非常普遍,一般来说前者发生在系统服务中,后者发生在时钟中断的服务程序中。\x0d\x0a\x0d\x0a调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。其最高优先级任务的寻找是通过建立就绪任务表来实现的。u C / O S 中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块TCB(Task Control Block)的数据结构,其中第一个成员变量就是保存的任务堆栈指针。任务调度模块首先用变量OSTCBHighRdy 记录当前最高级就绪任务的TCB 地址,然后调用OS_TASK_SW()函数来进行任务切换。\x0d\x0a\x0d\x0aμC/OS-II的组成部分\x0d\x0a\x0d\x0aμC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。\x0d\x0a\x0d\x0a1) 核心部分(OSCore.c)\x0d\x0a\x0d\x0a是 *** 作系统的处理核心,包括 *** 作系统初始化、 *** 作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。\x0d\x0a\x0d\x0a2) 任务处理部分(OSTask.c)\x0d\x0a\x0d\x0a任务处理部分中的内容都是与任务的 *** 作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。\x0d\x0a\x0d\x0a3) 时钟部分(OSTime.c)\x0d\x0a\x0d\x0aμC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等 *** 作是在这里完成的。\x0d\x0a\x0d\x0a4) 任务同步和通信部分\x0d\x0a\x0d\x0a为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。\x0d\x0a\x0d\x0a5) 与CPU的接口部分\x0d\x0a\x0d\x0a是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的 *** 作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。

书上说ucos移植时,调用OSStart()后启动时钟节拍,即在第一个任务中允许时钟节拍中断

int

main(void)

{BSP_Init()

OSInit()

OSTaskCreate(Task_START,(void

*)0,

&startup_task_stk[STARTUP_TASK_STK_SIZE-1],

STARTUP_TASK_PRIO)

OSStart()//启动各项任务后,任务就由 *** 作系统来管理和调度

return

0

}

这困凳是主函数

...

ucos

ii

并不是每个节拍都进行任务切换,只是每个时钟节拍仔尺答都去判断是否要进行任务切换;\r\n就算有一个优先级很念慧高的任务每个节拍都要切换,那么也不用担心,因为这个任务不可能在整个节拍的时间里都需要运行,那么一个节拍是10ms,它运行5ms,那么剩下的时间进入的是延时函数,延时函数里便能进行任务切换,让优先级低的任务得以运行。所以这个不用担心。

uC/OSII编程中的问题,程序出错,停在OSStart()那了

OS_EVENT

*QSemB

OS_EVENT

*QSemC

OS_EVENT

*AppSemSend[MAX_TCP_LINKS]

OS_EVENT

*AppSemCon[MAX_TCP_LINKS]

OS_EVENT

*AppSemDisc[MAX_TCP_LINKS]

void

*QMsgTbB[100]

void

*QMsgTbC[100]

void

*QMsgTbD[100]

void

*QMsgTbE[100]

char

rxmsg

ARPKT

arpkt

IPKT

ipkt

ICMPKT

icmpkt

UDPKT

udpkt

int

rfv1,da_d

OS_STK

Main_Stack[TASK_STACK_SIZE]=

{0,

}

void

Main_Task(void

*Id)

#define

Main_PRIO

20

OS_STK

TaskB_Stack[TASK_STACK_SIZE]=

{0,

}

void

TaskB_Task(void

*Id)

#define

TaskB_PRIO

12

OS_STK

TaskC_Stack[TASK_STACK_SIZE]=

{0,

}

void

TaskC_Task(void

*Id)

#define

TaskC_PRIO

14

void

Main_Task(void

*Id)

{

GENFRAME

*gft

WORD

dtype

ARMTargetStart()

OSTaskCreate(TaskB_Task,

(void

*)0,

(OS_STK

*)&TaskB_Stack[TASK_STACK_SIZE-1],

TaskB_PRIO)

OSTaskCreate(TaskC_Task,

(void

*)0,

(OS_STK

*)&TaskC_Stack[TASK_STACK_SIZE-1],

TaskC_PRIO)

while(1)

{

OS_ENTER_CRITICAL()

OS_EXIT_CRITICAL()

OSTimeDly(100)

}

}

void

TaskB_Task(void

*pdata)

//arp

{

INT8U

eer

ARPKT

*arp

NODE

node

char

*jrxmsg=0

int

txlen,ret=0

while

(1)

{

Uart_Printf("do_poll1!

")

OSTimeDly(50)

}

}

void

TaskC_Task(void

*pdata)

//icmp

{

INT8U

eer

IPKT

*ip1

ICMPKT

*icmp

int

txlen,len

NODE

node

char

*jrxmsg=0

Delay(100)

while

(1)

{

Uart_Printf("do_poll2!")

OSTimeDly(50)

}

}

void

Main(void)

{

ChangePllValue(88,10,0)

rBWSCON=0x11111012

//BANK2

IS

8

BIT

MODE

Port_Init()

Uart_Init(0,115200)

Led_Display1(0xf)

Uart_Select(0)

//Select

UART0//

//

Beep(0x1)

Uart_Printf("\n---------------------------------------------------------------")

Beep(0x00)

Uart_Printf("\nOEM

name

:

LiYuTai

Elec.Co.,Ltd.

")

Uart_Printf("\nWebsite

:

www.hzlitai.com.cn

")

Uart_Printf("\nEmail

:

lyt_tech@yahoo.com.cn

")

Uart_Printf("\nFunction

:

ARMSYS44b0's

Datagram

Test

Program

")

Uart_Printf("\nUART

config:

115.2kbps,8Bit,NP,UART0

")

Uart_Printf("\n---------------------------------------------------------------")

Uart_Printf("\nS3C44B0X

Test

Program

Ver

2.0

rSYSCFG=0x%x

MCLK=%dHz\n",rSYSCFG,MCLK)

Led_Display1(0x0)

Lcd_Init()

ARMTargetInit()//initialize

Target

//

Init

uCOS-II

OSInit()

//Create

the

Main

Task

OSTaskCreate(Main_Task,

(void

*)0,

(OS_STK

*)&Main_Stack[TASK_STACK_SIZE-1],

Main_PRIO)

QSemB=OSQCreate(&QMsgTbB[0],100)

QSemC=OSQCreate(&QMsgTbC[0],100)

/*

Start

uCOS-II

*/

OSStart()

}

以上为主程序的一部分,编译没有问题,上JTAG测试的时候老师出错,单步运行有时出错在一开始,有时出错在OSStart();那里,请高人指点迷津!不甚感激!!!

在什么系统上调试的

是不是汇编部分没有做好

你是在ARM系统上调试的

在arm上调试ucos的时候,OSStart()一运行,就开始启动定时器,二这个定时器是系统运行必须的

jtag无法调试定时器

就是说在jtag下,你只能让UCOS全速运行,无法单步运行

设置断点运行也可以

UC

OS-II

函数局部变量存在哪里?

内核结构:临界段、任务、任务状态、任务控制块(OS-TCB)、就绪表、任务调度、给调度器上锁和开锁、空闲任务(IDLE

TASK)、统计任务、中断处理、时钟节拍、UCOS2初始化和启动。

void

task1(void)

{

INT32U

count=0

start_Tick()

while(1)

{

printf("count",count++)

OSTIMEDLY(25)

}

}

void

task2(void)

{

INT32U

count=0

Ticker_init(OS_TICKS_PER_SEC)

while(1)

{

printf("count",count++)

OSTIMEDLY(50)

}

}

void

main()

{

sysinit()

OSInit()

OSTASKCREAT(Task1,(void*)&Task1Data,

(void*)&Task1STK[TASK_STK_SIZE],TASK1prio)

OSTASKCREAT(TASK2)

OSSTART()

}

例子中的UCOS系统中有3个任务。TASK1和TASK2仅仅是进行延时、研时不同的时间片、代码如图示。另一个是空闲任务,是UCOS启动时自动创建的。

UCOS运行开始于MAIN函数,代码如图。MAIN函数首先调用sysinit(),该函数不是 *** 作系统本身具有的,是一个自行编写的函数,用来做一些针对具体系统的初始化工作,这个函数不是必须的。

Osinit,这个函数是UCOS的系统函数,是UCOS启动时必须调用的。它主要是用来对UCOS内核中的各种数据结构做初始化工作。(同样是INT,在有的CPU体系结构中是16BIT,在有的CPU体系结构中是32BIT)此外它还会建立空闲任务IDLE

TASK,这个任务总是处于就绪态,优先级总是设为最低,这个任务从代码角度讲只是对一个全局变量OSIDLECTR做累加,它的作用是在系统空闲时消耗CPU时间。如果统计任务允许OS-TASK-STAT-EN和任务建立扩展允许都设为1,则OSinit()还得建立统计任务OSTaskstat()并且让其进入就绪态,优先级总是设为OS-LOWEST-PRIO-1。

接下来,2次调用OSTASKCREAT(),创建2个任务:TASK1和TASK2。从代码中我们看到有2个变量:TASK1STK和TASK2STK,分别为2个任务的堆栈,这个在前面提到过,UCOS的堆栈大小是可以根据需要定制的,从代码的角度讲,任务的堆栈是以全局数组的形式来实现的。调用OSTASKCREAT()时还有2个参数:TASK1PRIO和TASK2PRIO,它们表示的是任务的优先级,在例子中TASK2的任务优先级高于TASK1。需要注意,在MAIN函数中至少要建立一个任务,否则UCOS无法正常进行。

最后MAIN()函数调用OSSTART(),这个函数做的工作是从任务就绪表中找到优先级最高的任务的任务控制块,之后,OSSTART()调用高优先级就绪任务启动函数OSSTARTHIGHRDY(),这个函数与选择的微处理器有关,它是在针对具体平台进行移植时自行编写的。OSSTARTHIGHRDY()使已经创建的任务中优先级最高的任务开始运行,之后程序是不会返回OSSTART()的,本例子中TASK2首先开始执行。

再返回到程序清单,可以看到TASK2于TASK1相比唯一的不同就是TASK2执行的第一个语句是调用函数TICKER——INIT(),这是个自行编写的函数,作用是设置定时器,从而为 *** 作系统运行提供时钟节拍。之所以这样是由于UCOS的结构造成的,UCOS要求在OSSTART()运行后才能打开定时器中断。如果不这样做的话,时钟节拍中断有可能在UCOS启动第一个任务之前发生,此时UCOS处于不确定状态之中,程序有可能崩溃。

之后,UCOS就开始了运转,对于例子来说就是TASK1和TASK2以及空闲任务轮番工作。


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

原文地址: http://outofmemory.cn/yw/12328842.html

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

发表评论

登录后才能评论

评论列表(0条)

保存