ostaskcreate函数作用_认识上中下

ostaskcreate函数作用_认识上中下OSTaskCreate()是学习ucos-Ⅱ操作系统的第一个函数,费了九牛二虎之力,现在感觉差不多可以过了。#ifOS_TASK_CREATE_EN>0INT8UOSTaskCreate(void(*task)(void*p_arg),void*p_arg,OS_STK*ptos,INT8Uprio)/*1*/{ OS_STK…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 OSTaskCreate()是学习ucos-Ⅱ操作系统的第一个函数,费了九牛二虎之力,现在感觉差不多可以过了。


#if OS_TASK_CREATE_EN > 0
INT8U  OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)/*1*/
{						
    OS_STK    *psp;								/*2*/
    INT8U      err;
	
#if OS_CRITICAL_METHOD == 3                  					/*3*/
    OS_CPU_SR  cpu_sr = 0;
#endif

#if OS_ARG_CHK_EN > 0
    if (prio > OS_LOWEST_PRIO) 
    {              
        return (OS_ERR_PRIO_INVALID);						/*4*/
    }
#endif
	
    OS_ENTER_CRITICAL();
    if (OSIntNesting > 0) 							/*5*/												
    {                  
        OS_EXIT_CRITICAL();
        return (OS_ERR_TASK_CREATE_ISR);
    }
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0)					/*6*/
    {  
        OSTCBPrioTbl[prio] = OS_TCB_RESERVED; 					/*7*/
                                              
        OS_EXIT_CRITICAL();
		
        psp = OSTaskStkInit(task, p_arg, ptos, 0);    				/*8*/
		
        err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);		/*9*/
        if (err == OS_ERR_NONE) 
	{
            if (OSRunning == OS_TRUE) 						/*10*/
	    {       
                OS_Sched();							/*11*/
            }
        } 
	else
	{
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[prio] = (OS_TCB *)0;	 				/*12*/
            OS_EXIT_CRITICAL();
        }
        return (err);
    }
    else
    {
	OS_EXIT_CRITICAL();
	return (OS_ERR_PRIO_EXIST);						/*13*/
    }
}
#endif

/*1*/

void (*task)(void *p_arg):首先是个函数指针。在调用该函数时,将该任务的函数名(即该任务所占内存的首地址)作为指针传递过来;

void *p_arg:传递的任务参数,一般不用;

OS_STK *ptos,:该任务的堆栈的栈顶指针(堆栈增长的默认方向从上往下,从高地址往低地址);

INT8U prio:该任务的优先级。

/*2*/

OS_STK    *psp:定义一个堆栈类型的指针(该指针一直指向这个任务堆栈的栈顶,也称栈顶指针)。

/*3*/

OS_CPU_SR  cpu_sr = 0:定义一个OS_CPU_SR类型的cpu_sr的局部变量,

该变量描述cpu的状态寄存器的,每次屏蔽中断时,都将cpu状态寄存器的值存进cpu_sr这个变量中,每次打开中断时,再将cpu_sr的值赋值给cpu的状态寄存器。

/*4*/

prio > OS_LOWEST_PRIO:定义的优先级应在允许的范围内,否则不具备有效性。

/*5*/

OSIntNesting > 0:在中断处理程序中,不应进行任务创建,每次进入中断的时候,OSIntNesting ++,若大于0,必然在处理中断程序。

/*6*/

OSTCBPrioTbl[prio]:任务优先级列表是一个数组指针,该数组元素指向该任务控制块的内存地址;

(OS_TCB *)0:表示一个OS_TCB类型的指针,指向0,是一个空指针;

OSTCBPrioTbl[prio] == (OS_TCB *)0:该数组元素指向的内存地址是一个空地址,还没有被使用。

/*7*/

OS_TCB_RESERVED:即(OS_TCB *)1:表示一个OS_TCB类型的指针,指向1,表示非空指针;

OSTCBPrioTbl[prio] == (OS_TCB *)1, 该数组元素指向的内存地址是一个非空地址了,已经被占用了,还没有赋予具体的内存地址,这是一个宣告。

/*8*/

任务堆栈的初始化,并返回当前任务堆栈的栈顶指针。这个函数让我正确认识了堆栈的规则   后进先出,详情见OSTaskStkInit()函数。

/*9*/

任务控制块的初始化,并返回初始化的结果状态。详情见OS_TCBInit()函数。

/*10*/

OSRunning == OS_TRUE:操作系统的状态必须在运行的状态下,才能进行任务调度。操作系统运行过程中,OSRunning 第一次置为OS_TRUE状态是在OSStart()函数中实现的。


/*11*/

OS_Sched():进行任务调度。 详情见 OS_Sched()函数。

/*12*/

OSTCBPrioTbl[prio] = (OS_TCB *)0:若任务控制块初始化不成功,则释放被宣告占有的任务控制块。

/*13*/

return (OS_ERR_PRIO_EXIST):说明该任务控制块的内存地址已经被占用了,或者说该优先级已经被占用了。

上面是我对OSTaskCreate()函数的一些细节的认识,若有理解不对的地方,恳请指正!

好了,第一次写博希望大家多多支持!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196945.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Idea激活码永久有效Idea2020.2.1激活码教程-持续更新,一步到位

    Idea激活码永久有效Idea2020.2.1激活码教程-持续更新,一步到位Idea激活码永久有效2020.2.1激活码教程-Windows版永久激活-持续更新,Idea激活码2020.2.1成功激活

    2022年6月17日
    265
  • linux mysql导入数据库_mysql导出数据库为sql文件

    linux mysql导入数据库_mysql导出数据库为sql文件Linux导出sql文件到mysql数据库1.将sql文件上传到服务器上2.登录linux安装的mysql中mysql-uroot-pEnterpassword:******(密码)3.执行导入命令source/home/bak0902.sql4.查看数据库showdatabases;5.使用数据表useaaa;6.查看该库的表showtables;之后就是正常的sql查询即可!欢迎大神指导,可以留言交流!==============

    2022年9月1日
    4
  • 2015年度总结「建议收藏」

    2015年度总结「建议收藏」2015年度总结

    2022年4月24日
    43
  • java rpm卸载_使用RPM卸载软件「建议收藏」

    java rpm卸载_使用RPM卸载软件「建议收藏」rpm-e做了什么rpm-e(等同于rpm–erase)这个命令能够卸载或擦除一个或多个安装包,当RPM卸载一个RPM包时,做了以下几件事:确保数据库中没有其它包引用了要卸载的包。执行卸载前的脚本(如果有的话)检查配置文件是否已经被修改过,如果是,则保留它们的一个备份。查询数据库,找到这个包安装的所有文件,如果该些文件不属于别的包,则将它们删除。执行卸载后的脚本(如果有的话)从数据库中…

    2022年9月23日
    2
  • mac键盘快捷键使用大全_苹果电脑shift是哪个键

    mac键盘快捷键使用大全_苹果电脑shift是哪个键为了让初次用Mac的新手和小白们更快地上手,小编整理了一份Mac常用快捷键列表,虽然都是比较基础的入门知识,但也能帮助到大家更快地学习和查找macOS的键盘快捷键,以此提高电脑的操作效率。Mac与Windows的几个不同按键一切开始前,我们先来认识一下苹果Mac键盘上几个陌生的按键,比如⌘(Command/Cmd)、⌥“Option”、⌃“Ctrl”、⇧“Shift”等等。其中最为独特的就是Mac键盘专有的按键⌘,它叫做“Command”键(缩写叫Cmd,

    2022年9月29日
    2
  • 递归函数[通俗易懂]

    递归函数[通俗易懂]如果一个函数在内部调用自身,这个函数就叫做递归函数递归函数的简单定义如下:这只是一个简单的定义,什么也做不了。当然,你可以尝试会发生什么结果,理论上会永远运行下去,但实际操作时发现不一会儿程序就

    2022年7月1日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号