[应用相关] 初次创建任务

[复制链接]
1782|21
 楼主| dingbo95 发表于 2019-5-31 16:29 | 显示全部楼层 |阅读模式
什么是任务?
简单通俗的来讲,任务就是一个不会返回的函数。
  1. void task1(void *param)
  2. {
  3.         while(1)
  4.         {
  5.                 //执行区域
  6.                 ..........
  7.                 //执行区域
  8.         }       
  9. }
更加深入的来谈任务的话,不得不考虑栈、堆、数据区、代码区和内核寄存器。其中数据区和代码区由编译器自动分配,各个任务相互独立,并不冲突。堆的作用主要是用在动态能存分配上面。而栈和内核寄存器在任务切换的过程需要将数据保存,以方便下次任务切换回来可以从断点出执行。

 楼主| dingbo95 发表于 2019-5-31 16:30 | 显示全部楼层
建立任务结构体,该结构部分现在比较简单,只定义了一个指向任务堆栈地址的指针。
  1. //任务结构体
  2. typedef struct
  3. {
  4. um_uint32_t  *stack_addr; //指向任务堆栈地址
  5. }um_os;


 楼主| dingbo95 发表于 2019-5-31 16:31 | 显示全部楼层
通过任务结构体创建任务1与任务2,通过数组创建任务1和任务2的堆栈。
  1. um_os  OS_Task1;
  2. um_os  OS_Task2;
  3. um_uint32_t  task1_stack[1024];
  4. um_uint32_t  task2_stack[1024];


 楼主| dingbo95 发表于 2019-5-31 16:32 | 显示全部楼层
创建任务实现函数task1task2,这里什么也不做。
  1. void task1(void *param)
  2. {
  3.   while(1)
  4.         {
  5.        
  6.         }
  7. }
  8. void task2(void *param)
  9. {
  10.   while(1)
  11.         {
  12.        
  13.         }
  14. }


 楼主| dingbo95 发表于 2019-5-31 16:33 | 显示全部楼层
创建任务初始化函数,这里包含了四个形参:
参数1um_os *task;  任务结构指针
参数2 void(*entry)(void *)  任务入口函数
参数3 void *param 传递给任务的参数
参数4 UM_OS_uint32_t *stask_stack  任务对应堆栈地址
  1. void Task_Init(um_os *task,void(*entry)(void *),void *param,um_uint32_t *stack)
  2. {
  3.     task->stack_addr = stack;
  4. }


 楼主| dingbo95 发表于 2019-5-31 16:34 | 显示全部楼层
初始化任务1和任务2
  1. Task_Init(&OS_Task1,task1,(void *)0x11111111,&task1_stack[1024]);
  2. Task_Init(&OS_Task2,task2,(void *)0x22222222,&task2_stack[1024]);


 楼主| dingbo95 发表于 2019-5-31 16:35 | 显示全部楼层
keil工程中新建um_os.h文件,向该文件定义一些常用的数据类型和任务结构体,具体代码如下:
  1. #ifndef _UM_OS_H
  2. #define _UM_OS_H
  3. #include <stdint.h>

  4. /* UM-OS basic data type definitions */
  5. typedef signed char      um_int8_t;
  6. typedef signed short     um_int16_t;
  7. typedef signed long      um_int32_t;
  8. typedef unsigned char    um_uint8_t;
  9. typedef unsigned short   um_uint16_t;
  10. typedef unsigned long    um_uint32_t;
  11. /* boolean type definitions */
  12. #define um_TRUE                         1         /**< boolean true  */
  13. #define um_FALSE                        0         /**< boolean fails */
  14.        
  15. typedef struct
  16. {
  17.   um_uint32_t  *stack_addr; //Ö¸Ïò¸ÃÈÎÎñ¶ÑÕ»µØÖ•
  18. }um_os;


 楼主| dingbo95 发表于 2019-5-31 16:35 | 显示全部楼层
主函数中我们包含um_os.h头文件,通过um_os 任务结构体来新建两个任务OS_Task1与OS_Task2,通过重定义的um_uint32_t 来定义两个任务堆栈task1_stack与task2_stack.
629865cf0e7645c78c.png
 楼主| dingbo95 发表于 2019-5-31 16:36 | 显示全部楼层
在main.c中创建任务初始化函数,并将stack_addr指针指向任务堆栈地址,main()中分别对Task1和Task2做了初始化。
582625cf0e777c9f69.png
 楼主| dingbo95 发表于 2019-5-31 16:36 | 显示全部楼层
本节创建了um_os 的任务,并将任务函数和任务堆栈联系起来了,为后续的任务切换打下基础。
labasi 发表于 2019-6-18 11:39 | 显示全部楼层
任务可以调用别的任务吗
paotangsan 发表于 2019-6-18 12:01 | 显示全部楼层
也即是说任务能嵌套吗
renzheshengui 发表于 2019-6-18 12:13 | 显示全部楼层
讲解的非常透彻
wakayi 发表于 2019-6-18 12:44 | 显示全部楼层
任务的本质就是函数吗
 楼主| dingbo95 发表于 2019-6-20 22:49 | 显示全部楼层
wakayi 发表于 2019-6-18 12:44
任务的本质就是函数吗

是啊,有些说的不太准确
 楼主| dingbo95 发表于 2019-6-20 22:49 | 显示全部楼层

尽自己最大努力吧
 楼主| dingbo95 发表于 2019-6-20 22:49 | 显示全部楼层
paotangsan 发表于 2019-6-18 12:01
也即是说任务能嵌套吗

还没涉及到任务嵌套
 楼主| dingbo95 发表于 2019-6-20 22:50 | 显示全部楼层
labasi 发表于 2019-6-18 11:39
任务可以调用别的任务吗

可以的,现在就两个任务
wakayi 发表于 2019-7-4 11:16 | 显示全部楼层
dingbo95 发表于 2019-6-20 22:49
是啊,有些说的不太准确

看来我理解的还有有点到位的
labasi 发表于 2019-7-4 16:00 | 显示全部楼层
dingbo95 发表于 2019-6-20 22:50
可以的,现在就两个任务

其实就跟函数调用没啥不一样吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

1197

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部