历史上的今天
今天是:2025年01月21日(星期二)
2021年01月21日 | 快速学Arm(7)--uC/OS-II微小内核提供的14个用户接口函数
2021-01-21 来源:eefocus
这个系列的文章基本上记录了我学习的经过,我平时很忙,学什么东西都力争在最短的时间学到最多的东西.有时候因为太忙了,很多学习过程被中途打断,然后要隔一段时间才能重新再继续.学习方法对于我们掌握知识非常重要,我时常会抱怨下属或同事的学习速度慢,但又无法一下把经验传授出去.而且有些人的个人习惯也无法一下改变.现在技术发展很快,要学的东西很多,类似传统的学习方法肯定是跟不上时代的.
前几篇文章,我介绍了如何让我把运行的环境搭起来,这些学习的第一步,很多本本先生是不喜欢这一步骤的,因此他们永远把知识停留在书本上,理论上头头是道,实际却什么都做不了,"秀才".
接下来,的想法是打开Sample,找到main()函数,同样,我们也不着急去学什么东西,按照书本顺序学习是不行的,必须有自己的思路.在main()函数中我看到了一些uC/OS-II的系统函数,查了一下书,这些函数是uC/OS提供的用户接口函数,书上说一共14个.函数大概如下:
1.OSInit():
初始化uC/OS-II.必须在调用OSStart()函数之前调用此函数,而只有在调用OSStart()函数之后,uC/OS才真正开始运行多任务.
2.OSStart():
启动uC/OS的多任务环境,在调用OSStart()之前必须先调用OSInit().在用户程序中OSStart()只能被调用一次,第二次调用OSStart()将不执行任何操作.
3.OSTaskCreate():
建立一个新任务.即可以在多任务环境启动之前,也可以在真正运行的任务中创建任务.任务堆栈必须声明为OS_STK类型.注意在中断处理程序中不能建立任务.在任务中必须调用uC/OS提供的下述过程只有:延时等待,任务挂起,等待事件发生(等待信号量,消息信箱,消息队列),以便其他任务也能获取CPU的使用权.
4.OSTimeDly():
将一个任务延时若干个时钟节拍.延时事件的长度可以从0到65535个时钟节拍,延时时间0表示不进行延时,函数将立即返回调用者,延时的具体时间依赖于系统每秒钟有多少个时钟节拍(由文件OS_CFG.H中的常量OS_TICKS_PER_SEC设定).延时时间0表示不进行延时操作,而立即返回调用者,为了确保设定的延时时间,建议用户设定的时钟节拍数加1,例如希望延时10个时钟节拍,可以设定参数为11.
5.OSTimeTick():
在每次时钟节拍中断服务程序中被调用.此函数检查处于延时状态的任务十分达到延时时间,或正在等待事件的任务十分超时.OSTimeTick()的运行时间和系统中的任务数直接相关,在任务中断中都可以调用.如果在任务中调用,任务的优先级应该很高(优先级数字很小),这是因为OStimeTick()负责所有任务的延时操作.
6.OSTaskDel():
删除一个指定优先级的任务.被删除的任务将回到休眠状态,任务呗删除后可以用函数OSTaskCreate()重新建立.
7. OSIntEnter函数:
通知uC/OS一个中断服务程序已开始执行,这有助于uC/OS掌握中断嵌套的情况,通常OSIntExit()和OSIntEnter()联合使用.在中断服务程序中,如果保证直接递增OSIntNesting"原子操作",中断服务程序使用直接递增OSIntNesting的方法而不用调用OSIntEnter()函数.
注:原子操作--在一个任务执行过程中,如果某些操作不希望在执行过程中被别的任务或中断打断,那么这些不希望被打断的操作就是原子操作.
8.OSIntExit():
通知uC/OS一个中断服务以及执行完毕,这有助于uC/OS-掌握中断嵌套情况.通常OSIntExit()和OSIntEnter()联合使用.但最后一层嵌套中断执行完后,如果有更高优先级的任务准备就绪,uC/OS会调用任务调度函数,在这种情况下,中断返回到更高优先级的任务而不是被中断的任务.在任务不能调用该函数.即使中断服务程序使用直接递增OSIntNesting的方法(没有调用OSIntEnter()),也必须调用OSIntExit()函数.
9.OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL():
一般来说,OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()为宏定义,用来禁止,打开CPU的中断.二者必须成对使用.
10. OSSemCreate()函数:
建立并初始化一个信号量.必须先建立信号量,然后使用.
11. OSSemPend():
等待信号量,当任务调用此函数时,如果信号量的值大于0,那么OSSemPend()函数对该值减一并返回,如果调用函数信号量等于0,那么次函数将任务加入信号量的等待列表,任务将等待直到获得信号量或超时.必须先建立信号量,然后使用,不允许在中断中调用该函数,因为中断不能挂起.
12.OSSemPost():
发送信号量,如果指定的信号量是0或者大于0,此函数递增该信号量并返回.如果有人问在等待信号量,这最高优先级的任务将得到信号量并进入就绪状态.然后进行任务调度,决定当前允许的任务是否仍然处于最高优先级的就绪态任务.必须先建立信号量,然后使用.
13.OSSemDel():
删除信号量,在删除信号量之前,应当删除可能会使用这个信号量的任务.
1.使用这个函数调用时,必须特别小心,引起其他任务可能还要用这个信号量.
2.但挂起任务就绪时,中断关闭时间与挂起任务数目有关.
3.其他任务并不知道信号量被删除,除非检查pevent是否直线NULL.
史海拾趣
|
verilog 代码例程上这样写:output so;reg bb;always@()begin.......bb<= ..........end assign so= bb;为什么不直接output reg so;always @()begin........so<= .............end这种风格 有什么好处呢?… 查看全部问答> |
|
我一直以来都是用Linux的,从来没有用过商业的嵌入式OS,现在有些需要想了解一下。 WinCE开发从哪里可以下到最新的试用版或者免费的OS(用了学习和试验)? 现在最新的WinCE是哪个版本? 其与什么Pocket PC等是什么关系? 做WinCE的开发用什么开 ...… 查看全部问答> |
|
我现在正处于选择课题的困惑之中,我导师是做软件的,但我想做嵌入式开发,他让我自己找一个题目做,但是现在不知道做什么好,无从下手,大家给点意见。最后有公司计划开发什么课题,需要人做前期知识积累,我可以无条件参加,甚至可以毕业后到贵公 ...… 查看全部问答> |
|
【为C2000做贡献】基于DSP的CCD图像处理系统在点钞机中的应用 基于DSP的CCD图像处理系统在点钞机中的应用摘要介绍了一种基于DSP(数字信号处理器)的CCD(电荷耦合器件)图像处理系统的设计方法,采用线阵CCDTCD1 42D与TI公司的TMS320F281 2DSPDSP和89C52单片机结合设计了一种图像处理系统。介绍了系统硬件设计 ...… 查看全部问答> |
|
大家好:我用OMAP芯片,DSP为C674x的 通过EMIFB外接了一块内存,16位。之前开发板的程序在32位外接内存上没问题,我将EMIF的寄存器设置为16位,但还是不对。程序始终显示“running”不报错,请教! (cmd文件是这样的: MEMORY { ...… 查看全部问答> |
|
周立功对于LPC2103的配套教程,感觉还是比较简单易懂的,和大家分享一下 [ 本帖最后由 mdq123 于 2012-7-2 09:36 编辑 ]… 查看全部问答> |
|
利用pci-e实现工业控制中测试仪器的高精度数据采集系统,据说标题越长越被人看到! 利用pci-e实现工业控制中测试仪器的高精度数据采集系统,单板实现。外部直接接传感器。 PCI-E看到上次altera研讨会演示过,想用他用在产品中。 [ 本帖最后由 lfeng105 于 2012-10-18 10:32 编辑 ]… 查看全部问答> |




