ucosiii应用举例_SATA III接口

ucosiii应用举例_SATA III接口任务的创建和删除实验uCOSIII是多任务系统,那么肯定要创建任务,创建任务就是将任务控制块、任务堆栈、任务代码等联系在一起,并且初始化任务控制块的相应字段。在UCOSIII中我们通过函数OSTaskCreate();来创建任务,OSTaskCreate();函数原型如下(在os_task.c中有定义)。电泳OSTaskCreate();创建一个任务之后,刚创建的任务就会进入就绪状态,注意!

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

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

任务的创建和删除实验
uCOSIII是多任务系统,那么肯定要创建任务,创建任务就是将任务控制块、任务堆栈、任务代码等联系在一起,并且初始化任务控制块的相应字段。在UCOSIII中我们通过函数OSTaskCreate ();来创建任务,OSTaskCreate();函数原型如下(在os_task.c中有定义)。电泳OSTaskCreate ();创建一个任务之后,刚创建的任务就会进入就绪状态,注意!不能够在中断服务程序中调用OSTaskCreate ();函数创建任务。

void  OSTaskCreate (OS_TCB        *p_tcb,
CPU_CHAR      *p_name,
OS_TASK_PTR    p_task,
void          *p_arg,
OS_PRIO        prio,
CPU_STK       *p_stk_base,
CPU_STK_SIZE   stk_limit,
CPU_STK_SIZE   stk_size,
OS_MSG_QTY     q_size,
OS_TICK        time_quanta,
void          *p_ext,
OS_OPT         opt,
OS_ERR        *p_err)
{
CPU_STK_SIZE   i;
#if OS_CFG_TASK_REG_TBL_SIZE > 0u
OS_REG_ID      reg_nbr;
#endif
#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
OS_TLS_ID      id;
#endif
CPU_STK       *p_sp;
CPU_STK       *p_stk_limit;
CPU_SR_ALLOC();
#ifdef OS_SAFETY_CRITICAL
if (p_err == (OS_ERR *)0) {
OS_SAFETY_CRITICAL_EXCEPTION();
return;
}
#endif
#ifdef OS_SAFETY_CRITICAL_IEC61508
if (OSSafetyCriticalStartFlag == DEF_TRUE) {
*p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME;
return;
}
#endif
#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
if (OSIntNestingCtr > (OS_NESTING_CTR)0) {              /* ---------- CANNOT CREATE A TASK FROM AN ISR ---------- */
*p_err = OS_ERR_TASK_CREATE_ISR;
return;
}
#endif
#if OS_CFG_ARG_CHK_EN > 0u /* ---------------- VALIDATE ARGUMENTS ------------------ */
if (p_tcb == (OS_TCB *)0) {                             /* User must supply a valid OS_TCB */
*p_err = OS_ERR_TCB_INVALID;
return;
}
if (p_task == (OS_TASK_PTR)0) {                         /* User must supply a valid task */
*p_err = OS_ERR_TASK_INVALID;
return;
}
if (p_stk_base == (CPU_STK *)0) {                       /* User must supply a valid stack base address */
*p_err = OS_ERR_STK_INVALID;
return;
}
if (stk_size < OSCfg_StkSizeMin) {                      /* User must supply a valid minimum stack size */
*p_err = OS_ERR_STK_SIZE_INVALID;
return;
}
if (stk_limit >= stk_size) {                            /* User must supply a valid stack limit */
*p_err = OS_ERR_STK_LIMIT_INVALID;
return;
}
if (prio >= OS_CFG_PRIO_MAX) {                          /* Priority must be within 0 and OS_CFG_PRIO_MAX-1 */
*p_err = OS_ERR_PRIO_INVALID;
return;
}
#endif
#if OS_CFG_ISR_POST_DEFERRED_EN > 0u
if (prio == (OS_PRIO)0) {
if (p_tcb != &OSIntQTaskTCB) {
*p_err = OS_ERR_PRIO_INVALID;                    /* Not allowed to use priority 0 */
return;
}
}
#endif
if (prio == (OS_CFG_PRIO_MAX - 1u)) {
if (p_tcb != &OSIdleTaskTCB) {
*p_err = OS_ERR_PRIO_INVALID;                    /* Not allowed to use same priority as idle task */
return;
}
}
OS_TaskInitTCB(p_tcb);                                  /* Initialize the TCB to default values */
*p_err = OS_ERR_NONE;
/* --------------- CLEAR THE TASK'S STACK --------------- */
if ((opt & OS_OPT_TASK_STK_CHK) != (OS_OPT)0) {         /* See if stack checking has been enabled */
if ((opt & OS_OPT_TASK_STK_CLR) != (OS_OPT)0) {     /* See if stack needs to be cleared */
p_sp = p_stk_base;
for (i = 0u; i < stk_size; i++) {               /* Stack grows from HIGH to LOW memory */
*p_sp = (CPU_STK)0;                          /* Clear from bottom of stack and up! */
p_sp++;
}
}
}
/* ------- INITIALIZE THE STACK FRAME OF THE TASK ------- */
#if (CPU_CFG_STK_GROWTH == CPU_STK_GROWTH_HI_TO_LO)
p_stk_limit = p_stk_base + stk_limit;
#else
p_stk_limit = p_stk_base + (stk_size - 1u) - stk_limit;
#endif
p_sp = OSTaskStkInit(p_task,
p_arg,
p_stk_base,
p_stk_limit,
stk_size,
opt);
/* -------------- INITIALIZE THE TCB FIELDS ------------- */
p_tcb->TaskEntryAddr = p_task;                          /* Save task entry point address */
p_tcb->TaskEntryArg  = p_arg;                           /* Save task entry argument */
p_tcb->NamePtr       = p_name;                          /* Save task name */
p_tcb->Prio          = prio;                            /* Save the task's priority */
p_tcb->StkPtr        = p_sp;                            /* Save the new top-of-stack pointer */
p_tcb->StkLimitPtr   = p_stk_limit;                     /* Save the stack limit pointer */
p_tcb->TimeQuanta    = time_quanta;                     /* Save the #ticks for time slice (0 means not sliced) */
#if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u
if (time_quanta == (OS_TICK)0) {
p_tcb->TimeQuantaCtr = OSSchedRoundRobinDfltTimeQuanta;
} else {
p_tcb->TimeQuantaCtr = time_quanta;
}
#endif
p_tcb->ExtPtr        = p_ext;                           /* Save pointer to TCB extension */
p_tcb->StkBasePtr    = p_stk_base;                      /* Save pointer to the base address of the stack */
p_tcb->StkSize       = stk_size;                        /* Save the stack size (in number of CPU_STK elements) */
p_tcb->Opt           = opt;                             /* Save task options */
#if OS_CFG_TASK_REG_TBL_SIZE > 0u
for (reg_nbr = 0u; reg_nbr < OS_CFG_TASK_REG_TBL_SIZE; reg_nbr++) {
p_tcb->RegTbl[reg_nbr] = (OS_REG)0;
}
#endif
#if OS_CFG_TASK_Q_EN > 0u
OS_MsgQInit(&p_tcb->MsgQ,                               /* Initialize the task's message queue */
q_size);
#else
(void)&q_size;
#endif
OSTaskCreateHook(p_tcb);                                /* Call user defined hook */
#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
for (id = 0u; id < OS_CFG_TLS_TBL_SIZE; id++) {
p_tcb->TLS_Tbl[id] = (OS_TLS)0;
}
OS_TLS_TaskCreate(p_tcb);                               /* Call TLS hook */
#endif
/* --------------- ADD TASK TO READY LIST --------------- */
OS_CRITICAL_ENTER();
OS_PrioInsert(p_tcb->Prio);
OS_RdyListInsertTail(p_tcb);
#if OS_CFG_DBG_EN > 0u
OS_TaskDbgListAdd(p_tcb);
#endif
OSTaskQty++;                                            /* Increment the #tasks counter */
if (OSRunning != OS_STATE_OS_RUNNING) {                 /* Return if multitasking has not started */
OS_CRITICAL_EXIT();
return;
}
OS_CRITICAL_EXIT_NO_SCHED();
OSSched();
}

**void  OSTaskCreate (OS_TCB        *p_tcb,
CPU_CHAR      *p_name,
OS_TASK_PTR    p_task,
void          *p_arg,
OS_PRIO        prio,
CPU_STK       *p_stk_base,
CPU_STK_SIZE   stk_limit,
CPU_STK_SIZE   stk_size,
OS_MSG_QTY     q_size,
OS_TICK        time_quanta,
void          *p_ext,
OS_OPT         opt,
OS_ERR        *p_err)**

*p_tcb 指向任务的控制块OS_TCB
*p_name 指向任务的名字,我们可以为每一个任务取一个名字
p_task 执行任务代码,也就是任务函数的名字
*p_arg 传递给任务的参数
prio 任务优先级,数值越低优先级越高,用户不能够使用系统任务使用的那些优先级!
*p_stk_base 指向任务堆栈的基地址
stk_limit 任务堆栈深度,用来检测和确保堆栈不溢出
stk_size 任务堆栈大小
q_size COSIII中每个任务都有一个可选的内部消息队列,我们要定义OS_CFG_TASK_Q_EN>0,这时才能使用这个内部 消息队列
time_quanta 在使能时间片轮转调用时用来设置时间片长度,默认节拍为时钟节拍除以10.
*p_ext 指向用户补充的存储区。
opt 包含任务的特定选项,有如下选项可以设置。
OS_OPT_TASK_NONE 表示没有任何选项
OS_OPT_TASK_STK_CHK 指定是否允许检测该任务的堆栈
OS_OPT_TASK_STK_CLR 指定是否清除该任务的堆栈
OS_OPT_TASK_SAVE_FP 指定是否存浮点寄存器,CPU需要浮点运算硬件并且有专用代码保护浮点 寄存器
*p_err 用来保存调用该函数后返回的错误代码。

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196692.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 2022价值3888开源企业发卡网源码/全网对接/全新UI风格/完美运营

    2022价值3888开源企业发卡网源码/全网对接/全新UI风格/完美运营系统是全开源的,功能很多就不一一介绍了,喜欢就拿走,互站上卖3888免费开源,100%能搭建!发卡系统功能亮点介绍:1:已接入易支付接口/支持qq/微信/支付宝2:全网商品对接,店铺对接一秒完成对接,!3:商品池系统/供货系统/代理系统/对接码对接商品4:店铺音乐支付接口/缩我短网址接口/销售模版主题设置5:后台新增一键添加支付接口/商品池权限/推荐商品权限/商家保证金6:平均有15套pc售卡模版,3套手机售卡模版7:一些系统还带有后门,我这个系统完全无后门8:本系统不敢说全网最牛,但是我个人觉得很不错注

  • 常见开源分布式存储系统

    常见开源分布式存储系统系统整体对比对比说明/文件系统TFSFastDFSMogileFSMooseFSGlusterFSCeph开发语言C++CPerlCCC++开源协议GPLV2GPL

  • 外汇平台的搭建方法及注意事项有哪些_外汇平台搭建员工怎么判刑

    外汇平台的搭建方法及注意事项有哪些_外汇平台搭建员工怎么判刑摘要:从业外汇几年,都会听到外汇平台搭建,都知道外汇是个零和市场,赚少亏多,搭建外汇平台又可以做市商,且国家监管又很宽松,都想跃跃欲试,但是自己又不懂,不知道具体流程,又不知道需要多少资金,又没有认识的“人才”,又担心上当受骗,自然就会徘徊再做与不做之间。本文详…从业外汇几年,都会听到外汇平台搭建,都知道外汇是个零和市场,赚少亏多,搭建外汇平台又可以做市商,且国家监管又很宽松,都想跃跃欲试,但是…

  • 用自己的电脑搭建Web服务器建网站

    用自己的电脑搭建Web服务器建网站    这个也是个醉,上课时候在机房搭建成功了,结果回来很长时间没有管,居然给忘了,最近要写电子商务的作业,没办法,只能在捡起来了,又在自己电脑上搭建了一遍,过程都忘了,结果叫好友帮忙,谁知还是不行,还好我记得默认文档要改,这才成功搭建出来,不说了,开始今天的主题吧。搭建Web服务器建网站过程:1、当然是启用功能了window控制面板–&gt;程序与功能–&gt;启用或关闭W…

  • 计算机网络知识汇总(超详细整理)

    计算机网络知识汇总(超详细整理)为了准备期末考试,同时也是为了之后复习方便,特对计算机网络的知识进行了整理。本篇内容大部分是来源于我们老师上课的ppt。而我根据自己的理解,将老师的PPT整理成博文的形式以便大家复习查阅,同时对于一些不是很清楚的地方,我去查阅了相关资料进行补充,当然也会有部分个人看法夹带其中来帮助大家理解。

  • Python爬虫:URL管理器及其实现方式、网页下载器、网页解析器原理及其实现原理!

    Python爬虫:URL管理器及其实现方式、网页下载器、网页解析器原理及其实现原理!Python爬虫之URL管理器:Python爬虫:URL管理器实现方式:Python爬虫之网页下载器:urllib2实现网页下载器的三种方法:具体代码:              Python网页解析器:…

发表回复

您的电子邮箱地址不会被公开。

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