嵌入式系统数据结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FourLeafCloverLLLS/article/details/83037198

由于操作系统具有与普通软件不同的任务, 因此它就有些不同的特点, 包括一些不同的数据结构, 常用数据结构如下

一. 程序控制块

typedef struct tcb
{
	char* code_name;	//代码名称
	int p;				//重要性级别
	int V_num;			//版本号
	void (*fun)(void);	//指向被管理代码的函数指针
}TCB;

为了把这个结构与被管理代码关联起来, 该结构包含了一个指向被管理代码的指针(函数指针), 如下图所示

例2-8代码:

/*
* @Author: FourLeafClover
* @Date:   2018-10-13 10:52:38
* @Last Modified by:   FourLeafClover
* @Last Modified time: 2018-10-13 11:48:56
*/

#include <stdio.h>
#include <string.h>

/*TCB结构体定义*/
typedef struct tcb
{
	char* code_name;	//代码名称
	int p;				//重要性级别
	int V_num;			//版本号
	void (*fun)(void);	//指向被管理代码的函数指针
}TCB;

/*
 * @Fuction: fun1
 * @Description: 代码块一服务函数
 * @param: 无
 * @return: 无
 */
void fun1(void)
{
	printf("I am fun1\n");
}

/*
 * @Fuction: fun2
 * @Description: 代码块二服务函数
 * @param: 无
 * @return: 无
 */
void fun2(void)
{
	printf("I am fun2\n");
}

/*
 * @Fuction: fun3
 * @Description: 代码块三服务函数
 * @param: 无
 * @return: 无
 */
void fun3(void)
{
	printf("I am fun3\n");
}

/*
 * @Fuction: TCB GreateTCB(char*name, int pp, int vnum, void(*f)(void))
 * @Description: 创建代码块函数
 * @param name: 代码块的名字
 * @param pp: 代码块重要性
 * @param vnum: 代码块版本号
 * @param f: 代码块的执行函数
 * @return: tcb: 初始化的代码块结构体
 */
TCB GreateTCB(char*name, int pp, int vnum, void(*f)(void))
{
	TCB tcb;			  //创建程序控制块结构体
	tcb.code_name = name; //控制块代码块名字赋值
	tcb.p = pp;			  //重要性级别赋值
	tcb.V_num = vnum;	  //版本号赋值
	tcb.fun = f;		  //控制函数赋值

	return tcb;
}


int main(void)
{
	char code_name[3] = {0};//定义代码块名字
	char i = 0;				
	char t = 0;				//定义查询标志
	TCB tcb[3];								//创建TCB结构体数组
	tcb[0] = GreateTCB("F1", 2, 1, fun1);	//定义代码块一的初始值
	tcb[1] = GreateTCB("F2", 3, 1, fun2);	//定义代码块二的初始值
	tcb[2] = GreateTCB("F3", 4, 1, fun3);	//定义代码块二的初始值

	/*用户查询需要的函数名, 并输入*/
	printf("Please select fun_name:");
	scanf("%s", code_name);

	/*在tcb结构体中查询用户寻找的函数名*/
	for (i = 0; i < 3; i++)
	{
		/*对比结构体中的名字书否与用户输入的名字一样*/
		if(strcmp(tcb[i].code_name, code_name) == 0)
		{
			tcb[i].fun();	//一样则调用相应的函数
			t = 1;			//置标志位为1
		}	
		/*没有查询相应的函数*/
		if((t == 0)&&(i == 2))
		{
			/*打印提示信息*/
			printf("No code_name: %s\n", code_name);
		}	
	}
	return 0;
}
/*
* @Author: FourLeafClover
* @Date:   2018-10-13 10:52:38
* @Last Modified by:   FourLeafClover
* @Last Modified time: 2018-10-13 18:21:30
*/

#include <stdio.h>
#include <string.h>

/*TCB结构体定义*/
typedef struct tcb
{
	struct tcb *pre;	//指向前一个结构体的指针
	struct tcb *next;	//指向下一个结构体的指针
	char* code_name;	//代码名称
	int p;				//重要性级别
	int V_num;			//版本号
	void (*fun)(void);	//指向被管理代码的函数指针
}TCB;

/*
 * @Fuction: fun1
 * @Description: 代码块一服务函数
 * @param: 无
 * @return: 无
 */
void fun1(void)
{
	printf("I am fun1\n");
}

/*
 * @Fuction: fun2
 * @Description: 代码块二服务函数
 * @param: 无
 * @return: 无
 */
void fun2(void)
{
	printf("I am fun2\n");
}

/*
 * @Fuction: fun3
 * @Description: 代码块三服务函数
 * @param: 无
 * @return: 无
 */
void fun3(void)
{
	printf("I am fun3\n");
}

/*
 * @Fuction: TCB GreateTCB(char*name, int pp, int vnum, void(*f)(void))
 * @Description: 创建代码块函数
 * @param pre: 前一个控制块结构体地址
 * @param next: 后一个控制块结构体地址
 * @param name: 代码块的名字
 * @param pp: 代码块重要性
 * @param vnum: 代码块版本号
 * @param f: 代码块的执行函数
 * @return: tcb: 初始化的代码块结构体
 */
TCB GreateTCB(TCB *pre, TCB *next, char*name, int pp, int vnum, void(*f)(void))
{
	TCB tcb;			  //创建程序控制块结构体
	tcb.pre = pre;		  //设置前一个控制块的地址
	tcb.next = next;	  //设置后一个控制块的地址
	tcb.code_name = name; //控制块代码块名字赋值
	tcb.p = pp;			  //重要性级别赋值
	tcb.V_num = vnum;	  //版本号赋值
	tcb.fun = f;		  //控制函数赋值

	return tcb;
}


int main(void)
{
	char str_number = 0;//定义代码块名字
	char i = 0;				
	char t = 0;				//定义查询标志
	TCB tcb[3];								//创建TCB结构体数组
	TCB *(tcb_array[3]) = {NULL};			//定义三个指针的指针数组
	tcb[0] = GreateTCB(NULL, &tcb[1], "F1", 2, 1, fun1);	//定义代码块一的初始值
	tcb[1] = GreateTCB(&tcb[0], &tcb[2], "F2", 3, 1, fun2);	//定义代码块二的初始值
	tcb[2] = GreateTCB(&tcb[1], NULL, "F3", 4, 1, fun3);	//定义代码块二的初始值

	/*给指针数组赋值*/
	for (i = 0; i < 3; i++)
	{
		tcb_array[i] = &tcb[i];
	}

	/*用户查询需要的函数, 并输入*/
	printf("Please select number struct:");
	scanf("%d", &str_number);

	/*查找相应的结构体*/
	if(NULL == tcb_array[str_number]->pre)
		printf("the pre struct is NULL\n");	
	else
		(tcb_array[str_number] -> pre) -> fun();
	tcb_array[str_number] -> fun();

	if(NULL == tcb_array[str_number]->next)
		printf("the next struct is NULL\n");	
	else
		(tcb_array[str_number] -> next) -> fun();

	return 0;
}

三  位图

看到位图, 想起了做智能的时候, 对图像进行二值化, 这个原理也差不多. 做个小实验吧,  把上面的三个结构体控制块分别设一个已经被占用, 两个个未被占用,  让程序找出未被占用的控制块.代码如下:

/*
* @Author: FourLeafClover
* @Date:   2018-10-13 10:52:38
* @Last Modified by:   FourLeafClover
* @Last Modified time: 2018-10-13 18:50:35
*/

#include <stdio.h>
#include <string.h>

/*TCB结构体定义*/
typedef struct tcb
{
	struct tcb *pre;	//指向前一个结构体的指针
	struct tcb *next;	//指向下一个结构体的指针
	char* code_name;	//代码名称
	int p;				//重要性级别
	int V_num;			//版本号
	void (*fun)(void);	//指向被管理代码的函数指针
	char UsingFlag;		//定义是否正在使用, 0-未使用 1-正在使用
}TCB;

/*
 * @Fuction: fun1
 * @Description: 代码块一服务函数
 * @param: 无
 * @return: 无
 */
void fun1(void)
{
	printf("I am fun1\n");
}

/*
 * @Fuction: fun2
 * @Description: 代码块二服务函数
 * @param: 无
 * @return: 无
 */
void fun2(void)
{
	printf("I am fun2\n");
}

/*
 * @Fuction: fun3
 * @Description: 代码块三服务函数
 * @param: 无
 * @return: 无
 */
void fun3(void)
{
	printf("I am fun3\n");
}

/*
 * @Fuction: TCB GreateTCB(char*name, int pp, int vnum, void(*f)(void))
 * @Description: 创建代码块函数
 * @param pre: 前一个控制块结构体地址
 * @param next: 后一个控制块结构体地址
 * @param name: 代码块的名字
 * @param pp: 代码块重要性
 * @param vnum: 代码块版本号
 * @param f: 代码块的执行函数
 * @param UsingFlag: 是否使用标志位
 * @return: tcb: 初始化的代码块结构体
 */
TCB GreateTCB(TCB *pre, TCB *next, char*name, int pp, int vnum, void(*f)(void), char UsingFlag)
{
	TCB tcb;			  //创建程序控制块结构体
	tcb.pre = pre;		  //设置前一个控制块的地址
	tcb.next = next;	  //设置后一个控制块的地址
	tcb.code_name = name; //控制块代码块名字赋值
	tcb.p = pp;			  //重要性级别赋值
	tcb.V_num = vnum;	  //版本号赋值
	tcb.fun = f;		  //控制函数赋值
	tcb.UsingFlag = UsingFlag;//对标志位赋值

	return tcb;
}


int main(void)
{
	char str_number = 0;//定义代码块名字
	char i = 0;				
	char t = 0;				//定义查询标志
	TCB tcb[3];								//创建TCB结构体数组
	TCB *(tcb_array[3]) = {NULL};			//定义三个指针的指针数组
	tcb[0] = GreateTCB(NULL, &tcb[1], "F1", 2, 1, fun1, 0);	//定义代码块一的初始值
	tcb[1] = GreateTCB(&tcb[0], &tcb[2], "F2", 3, 1, fun2, 0);	//定义代码块二的初始值
	tcb[2] = GreateTCB(&tcb[1], NULL, "F3", 4, 1, fun3, 0);	//定义代码块二的初始值

	/*给指针数组赋值*/
	for (i = 0; i < 3; i++)
	{
		tcb_array[i] = &tcb[i];
	}

	/*用户查询需要的函数, 并输入*/
	printf("Please select Using tcb number:");
	scanf("%d", &str_number);

	/*置相应的控制块为使用标志*/
	tcb[str_number].UsingFlag = 1;
	/*查找证被使用的控制块*/
	for (i = 0; i < 3; i++)
	{
		if (1 == tcb[i].UsingFlag)
		{
			tcb[i].fun();
			break;
		}
	}

	if(3 == i)
	{
		printf("can not find!\n");
	}

	return 0;
}

完结!!!

猜你喜欢

转载自blog.csdn.net/FourLeafCloverLLLS/article/details/83037198