OSTaskCreateExt_getlocaltime函数

OSTaskCreateExt_getlocaltime函数uC/OS创建任务有几个硬性要求1.任务必须被创建在多任务开始之前或者是运行的任务中。2.任务不能由ISR创建。3.任务必须在死循环中,并且不能有返回。//建立一个新任务  #if OS_TASK_CREATE_EN > 0                //允许生成OSTaskCreate()函数  INT8U  OSTaskCreate

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

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

uC/OS创建任务有几个硬性要求

1. 任务必须被创建在多任务开始之前或者是运行的任务中。

2. 任务不能由ISR创建。

3. 任务必须在死循环中,并且不能有返回。



  1. //建立一个新任务  
  2. #if OS_TASK_CREATE_EN > 0                //允许生成OSTaskCreate()函数  
  3. INT8U  OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)  
  4. {  
  5. #if OS_CRITICAL_METHOD == 3                  //中断函数被设定为模式3  
  6.     OS_CPU_SR  cpu_sr;  
  7. #endif  
  8.     OS_STK    *psp;                         //初始化任务堆栈指针变量,返回新的栈顶指针  
  9.     INT8U      err;                         //定义(获得并定义初始化任务控制块)是否成功  
  10.   
  11.   
  12. #if OS_ARG_CHK_EN > 0                        //所有参数必须在指定的参数内  
  13.     if (prio > OS_LOWEST_PRIO) {            //检查任务优先级是否合法  
  14.         return (OS_PRIO_INVALID);           //参数指定的优先级大于OS_LOWEST_PRIO  
  15.     }  
  16. #endif  
  17.     OS_ENTER_CRITICAL();            //关闭中断  
  18.     if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使用,即就绪态为0  
  19.         OSTCBPrioTbl[prio] = (OS_TCB *)1;    //保留这个优先级,将就绪态设为1  
  20.                                               
  21.         OS_EXIT_CRITICAL();             //打开中断  
  22.         psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);    //初始化任务堆栈  
  23.         err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);       //获得并初始化任务控制块  
  24.         if (err == OS_NO_ERR) {     //任务控制初始化成功  
  25.             OS_ENTER_CRITICAL();    //关闭中断  
  26.             OSTaskCtr++;            //任务计数器加1  
  27.             OS_EXIT_CRITICAL();     //打开中断  
  28.             if (OSRunning == TRUE) {         //检查是否有(某个)任务在运行  
  29.                 OS_Sched();                  //任务调度,最高任务优先级运行  
  30.             }  
  31.         } else {        //否则,任务初始化失败  
  32.             OS_ENTER_CRITICAL();        //关闭中断  
  33.             OSTCBPrioTbl[prio] = (OS_TCB *)0;       //放弃任务,设此任务就绪态为0  
  34.             OS_EXIT_CRITICAL();                     //打开中断  
  35.         }  
  36.         return (err);           //返回(获得并定义初始化任务控制块是否成功)  
  37.     }  
  38.     OS_EXIT_CRITICAL();         //打开中断  
  39.     return (OS_PRIO_EXIST);     //返回(具有该优先级的任务已经存在)  
  40. }  
  41. #endif  
  42.   
  43.   
  44.   
  45. //建立一个新任务。与OSTaskCreate()不同的是,OSTaskCreateExt()允许用户设置更多的细节  
  46. //内容。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立,但中断处理  
  47. //程序中不能建立新任务。一个任务必须为无限循环结构,且不能有返回点。  
  48. #if OS_TASK_CREATE_EXT_EN > 0                //允许生成OSTaskCreateExt()函数  
  49. INT8U  OSTaskCreateExt (void   (*task)(void *pd),   //建立扩展任务(任务代码指针)  
  50.                         void    *pdata,             //传递参数指针  
  51.                         OS_STK  *ptos,              //分配任务堆栈栈顶指针  
  52.                         INT8U    prio,              //分配任务优先级  
  53.                         INT16U   id,                //(未来的)优先级标识(与优先级相同)  
  54.                         OS_STK  *pbos,              //分配任务堆栈栈底指针  
  55.                         INT32U   stk_size,          //指定堆栈的容量(检验用)  
  56.                         void    *pext,              //指向用户附加的数据域的指针  
  57.                         INT16U   opt)               //建立任务设定选项  
  58. {  
  59. #if OS_CRITICAL_METHOD == 3                  //中断函数被设定为模式3  
  60.     OS_CPU_SR  cpu_sr;  
  61. #endif  
  62.     OS_STK    *psp;                         //初始化任务堆栈指针变量,返回新的栈顶指针  
  63.     INT8U      err;                         //定义(获得定义初始化任务控制块)是否成功  
  64.   
  65.   
  66. #if OS_ARG_CHK_EN > 0        //所有参数必须在指定的参数内  
  67.     if (prio > OS_LOWEST_PRIO) {             //检查任务优先级是否合法  
  68.         return (OS_PRIO_INVALID);            //参数指定的优先级大于OS_LOWEST_PRIO  
  69.     }  
  70. #endif  
  71.     OS_ENTER_CRITICAL();        //关闭中断  
  72.     if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { //确认优先级未被使用,即就绪态为0  
  73.         OSTCBPrioTbl[prio] = (OS_TCB *)1;    //保留这个优先级,将就绪态设为0  
  74.                                                
  75.         OS_EXIT_CRITICAL();     //打开中断  
  76.   
  77.         //以下两为1堆栈才能清0  
  78.         if (((opt & OS_TASK_OPT_STK_CHK) != 0x0000) ||   //检验任务堆栈,CHK=1  
  79.             ((opt & OS_TASK_OPT_STK_CLR) != 0x0000)) {   //任务建立时是否清0,CLR=1  
  80.             #if OS_STK_GROWTH == 1          //堆栈生长方向  
  81.             (void)memset(pbos, 0, stk_size * sizeof(OS_STK));       //从下向上递增  
  82.             #else  
  83.             (void)memset(ptos, 0, stk_size * sizeof(OS_STK));       //从下向下递减  
  84.             #endif  
  85.         }  
  86.   
  87.         psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt);      //初始化任务堆栈  
  88.         err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);     //获得并初始化任务控制块  
  89.         if (err == OS_NO_ERR) { //任务控制初始化成功  
  90.             OS_ENTER_CRITICAL();        //关闭中断  
  91.             OSTaskCtr++;                //任务计数器加1  
  92.             OS_EXIT_CRITICAL();         //打开中断  
  93.             if (OSRunning == TRUE) {              //检查是否有(某个)任务在运行  
  94.                 OS_Sched();                       //任务调度,最高任务优先级运行  
  95.             }  
  96.         } else {        //否则,任务初始化失败  
  97.             OS_ENTER_CRITICAL();        //关闭中断  
  98.             OSTCBPrioTbl[prio] = (OS_TCB *)0;                 //放弃任务,设此任务就绪态为0  
  99.             OS_EXIT_CRITICAL();         //打开中断  
  100.         }  
  101.         return (err);       //返回(获得并定义初始化任务控制块是否成功)  
  102.     }  
  103.     OS_EXIT_CRITICAL();     //打开中断  
  104.     return (OS_PRIO_EXIST);     //具有该优先级的任务已经存在  
  105. }  
  106. #endif  

具体函数的介绍好需要看官方的文档:http://sigpromu.org/brett/elec3730/quickref.html

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

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

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


相关推荐

  • 运维人员常用到的11款服务器监控工具「建议收藏」

    运维人员常用到的11款服务器监控工具「建议收藏」目录1、zabbix2、Nagios3、PerformanceCo-Pilot4、Anturis5、SeaLion6、Icinga7、Munin8、Monit9、SimpleServerMonitor10、SysUsage11、Pingdom1、zabbixzabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。abbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决

    2022年5月2日
    40
  • 漏洞挖掘丨敏感信息泄露+IDOR+密码确认绕过=账户劫持

    漏洞挖掘丨敏感信息泄露+IDOR+密码确认绕过=账户劫持获得账户auth_token目标网站是一个工作招聘门户网站,测试保密原因暂且称其为redacted.com。一开始,我登录以应聘者身份去测试CSRF或某些存储型XSS,但没什么发现。接下来,我就想到了越权测试(IDOR),为此,我又创建了另外一个账号,两个账号一起可以测试如注册、登录、忘记密码等功能点的越权可能。创建账号前我开启了流量抓包想看看具体服务端的响应,注册开始时,网站会跳出一个提示,…

    2022年6月10日
    31
  • 语义分割代码一步步实现_语义分割应用

    语义分割代码一步步实现_语义分割应用语义分割的整体实现代码大致思路很简单,但是具体到细节,就有很多可说的东西。之前写过一篇文章,可能有些地方现在又有了新的思路或者感受,或者说之前没有突出重点。作为一个小白,这里把自己知道的知识写一下,事无巨细,希望看到的人能有所收获。一、文件思路总的来说,语义分割代码可以分为如下几个部分:data:图像数据 data/train:训练集数据 data/train/img:…

    2022年8月21日
    9
  • 代理重加密_代理重加密BBS方案

    代理重加密_代理重加密BBS方案云计算中的数据机密性风险极大地阻碍了云计算的应用,而在用户端加密的模式对于数据共享来说非常不便,用户频繁的获取和释放授权将使得用户增效据加解密工作繁重。因此代理重加密技术在云端进行数据的密文转换,减轻了用户端的负担,同时加强了云端数据的保密性。一、代理重加密代理重加密是密文间的一种密钥转换机制,是由Blaze等人在1998年的欧洲密码学年会上提出的,并由Ateniese等人在2005年的网络和分布式系统安全研讨会议和2007年的美国计算机学会计算机与通信安全会议上给出了规范的形式化定义。在代理重加密中

    2025年10月14日
    1
  • 高效上网教程—如何在线看片找片

    高效上网教程—如何在线看片找片高效上网教程如何在线看片找片一、总结一句话总结:1、电影资源网站推荐?2、在线看片网站推荐?3、看美剧和下载美剧资源推荐?4、字幕下载网站推荐?5、纪录片资源推荐?二、内容在总结中

    2022年7月1日
    78
  • 城市三级联动

    城市三级联动

    2021年9月12日
    54

发表回复

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

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