从0到1写嵌入式操作系统---------------------------3.初次创建任务

1.什么是任务?

简单通俗的来讲,任务就是一个不会返回的函数。

void task1(void *param)
{
	while(1)
	{
		//执行区域
		..........
		//执行区域
	}	
}

      更加深入的来谈任务的话,不得不考虑栈、堆、数据区、代码区和内核寄存器。其中数据区和代码区由编译器自动分配,各个任务相互独立,并不冲突。堆的作用主要是用在动态能存分配上面。而栈和内核寄存器在任务切换的过程需要将数据保存,以方便下次任务切换回来可以从断点出执行。

2.建立任务结构体,该结构部分现在比较简单,只定义了一个指向任务堆栈地址的指针。

//任务结构体
typedef struct
{
 um_uint32_t  *stack_addr; //指向任务堆栈地址
}um_os;

3. 通过任务结构体创建任务1与任务2,通过数组创建任务1和任务2的堆栈。

um_os  OS_Task1;
um_os  OS_Task2;
um_uint32_t  task1_stack[1024];
um_uint32_t  task2_stack[1024];

4. 创建任务实现函数task1与task2,这里什么也不做。

void task1(void *param)
{
  while(1)
	{
	
	}
}
void task2(void *param)
{
  while(1)
	{
	
	}
}

5.创建任务初始化函数,这里包含了四个形参:

参数1: um_os *task;  任务结构指针
参数2: void(*entry)(void *)  任务入口函数
参数3: void *param 传递给任务的参数
参数4: UM_OS_uint32_t *stask_stack  任务对应堆栈地址
void Task_Init(um_os *task,void(*entry)(void *),void *param,um_uint32_t *stack)
{
    task->stack_addr = stack;
}

6. 初始化任务1和任务2

Task_Init(&OS_Task1,task1,(void *)0x11111111,&task1_stack[1024]);
Task_Init(&OS_Task2,task2,(void *)0x22222222,&task2_stack[1024]);

7.在keil工程中新建um_os.h文件,向该文件定义一些常用的数据类型和任务结构体,具体代码如下:

#ifndef _UM_OS_H
#define _UM_OS_H
#include <stdint.h>

/* UM-OS basic data type definitions */
typedef signed char      um_int8_t;
typedef signed short     um_int16_t;
typedef signed long      um_int32_t;
typedef unsigned char    um_uint8_t;
typedef unsigned short   um_uint16_t;
typedef unsigned long    um_uint32_t;
/* boolean type definitions */
#define um_true                          1         /**< boolean true  */
#define um_false                          0         /**< boolean fails */
	
typedef struct
{
  um_uint32_t  *stack_addr; 
}um_os;

8.主函数中我们包含um_os.h头文件,通过um_os 任务结构体来新建两个任务OS_Task1与OS_Task2,通过重定义的um_uint32_t 来定义两个任务堆栈task1_stack与task2_stack.

9.在main.c中创建任务初始化函数,并将stack_addr指针指向任务堆栈地址,main()中分别对Task1和Task2做了初始化。

本次创建了um_os 的任务,并将任务函数和任务堆栈联系起来了,为后续的任务切换打下基础。

 

 

 

 

一步步嵌入式操作系统 linux平台实现代码 step 0 准备开发环境 1 安装交叉编译工具 sudo apt-get install gcc-arm-none-eabi sudo apt-get install gcc-arm-linux-gnueabihf sudo apt-get install g++-arm-linux-gnueabihf 2 手边编译skyeye 用apt命令安装的skyeye模拟器版本(1.2.5)有bug,需要手动编译更高版本的skyeye 下载并解压skyeye 1.2.6_rc1的代码, ~/Downloads/skyeye-1.2.6_rc1 根据执行skyeye-1.2.6_rc1/INSTALL的说明 1 执行 ./configure 2 执行 make 后 编译错误1: In file included from /usr/include/fcntl.h:289:0, from nandflash/nandflash_smallblock.c:19: In function ‘open’, inlined from ‘nandflash_sb_setup’ at nandflash/nandflash_smallblock.c:519:24: /usr/include/x86_64-linux-gnu/bits/fcntl2.h:50:4: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments __open_missing_mode (); 解决方法: 修改skyeye-1.2.6_rc1/device/nandflash/nandflash_smallblock.c 519行 if ((nf->fdump= open(dev->dump, FILE_FLAG)) < 0) 改为: if ((nf->fdump= open(dev->dump, FILE_FLAG, 0777)) < 0) 编译错误2: gcc -g -O2 -o skyeye skyeye.o ./utils/libutils.a ./arch/arm/libarm.a ./device/libdev.a ./arch/mips/libmips.a ./arch/ppc/libppc.a ./arch/bfin/libbfin.a ./arch/mips/libmips.a ./arch/coldfire/libcoldfire.a -lc ./utils/libutils.a -lbfd -lm -lc ./arch/mips/libmips.a(decoder.o):在函数‘decode’中: /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1079:对‘sign_extend_UInt32’未定义的引用 /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1105:对‘sign_extend_UInt32’未定义的引用 /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1049:对‘sign_extend_UInt32’未定义的引用 /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1027:对‘sign_extend_UInt32’未定义的引用 /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1013:对‘sign_extend_UInt32’未定义的引用 ./arch/mips/libmips.a(decoder.o):/home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:1001: 跟着更多未定义的参考到 sign_extend_UInt32 ./arch/mips/libmips.a(decoder.o):在函数‘decode’中: /home/kolya/Downloads/skyeye-1.2.6_rc1/arch/mips/common/decoder.c:240:对‘divide_UI
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值