Cstyle的札记,Freertos内核详解,第2篇

<span style="white-space:pre">	</span>RTOS里面最常见也最核心的数据结构,双向链表实现。 VS 2008下可编译测试。
<pre name="code" class="cpp">/** @file

	Copyright (c) 2008 - 2014, MX.Studio 

	All rights reserved. 

	Created by Cstyle
**/
#ifndef _LIST_H_
#define _LIST_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "Syslib.h"

struct ListNode
{
	struct ListNode *pPrevious;
	struct ListNode *pNext;
};

typedef struct ListNode List_t;

List_t * ListCreate();
UINT8 List_InsertEnd(List_t * const ListHead,List_t * const ListItem);
UINT8 List_InsertHead(List_t * const ListHead,List_t * const ListItem);//insert at the head of list
UINT8 List_DeletEnd(List_t * const ListHead); //delet item from the end of list
UINT8 List_DeletHead(List_t * const ListHead); //delet item from head of list
UINT8 List_IsEmpty(List_t * const ListHead);
UINT8 List_Destroy(List_t * const ListHead);
void List_Test();

#ifdef __cplusplus
}
#endif

#endif

</pre><pre code_snippet_id="438878" snippet_file_name="blog_20140730_5_4820611" name="code" class="cpp">
</pre><pre code_snippet_id="438878" snippet_file_name="blog_20140730_6_6663774" name="code" class="cpp">/** @file

	Copyright (c) 2008 - 2014, MX.Studio 

	All rights reserved. 

	Created by Cstyle
**/
#include "List.h"

List_t * ListCreate()
{
	List_t *p;
	p=(List_t *)malloc(sizeof(List_t));
	Assert(p);
	p->pPrevious=p;
	p->pNext=p;
	return p;
}

UINT8 List_InsertEnd(List_t * const ListHead,List_t * const ListItem)//insert at the end of list
{
	Assert(ListHead);
	Assert(ListItem);
	ListItem->pPrevious=ListHead->pPrevious;
	ListItem->pNext=ListHead;
	ListHead->pPrevious->pNext=ListItem;
	ListHead->pPrevious=ListItem;
	return 0;
}

UINT8 List_InsertHead(List_t * const ListHead,List_t * const ListItem)//insert at the head of list
{
	Assert(ListHead);
	Assert(ListItem);
	ListItem->pPrevious = ListHead;
	ListItem->pNext = ListHead->pNext;
	ListHead->pNext->pPrevious = ListItem;
	ListHead->pNext = ListItem;
	return 0;
}

UINT8 List_DeletEnd(List_t * const ListHead) //delet item from the end of list
{
	//usr should free memory by manual
	Assert(ListHead);
	Assert(!List_IsEmpty(ListHead));
	ListHead->pPrevious->pPrevious->pNext=ListHead;
	ListHead->pPrevious=ListHead->pPrevious->pPrevious;
	return 0;
}

UINT8 List_DeletHead(List_t * const ListHead) //delet item from head of list
{
	//usr shoud free memor by mannal
	Assert(ListHead);
	Assert(!List_IsEmpty(ListHead));
	ListHead->pNext->pNext->pPrevious=ListHead;
	ListHead->pNext=ListHead->pNext->pNext;
	return 0;
}

UINT8 List_IsEmpty(List_t * const ListHead)
{
	Assert(ListHead);
	if((ListHead->pPrevious==ListHead)&&(ListHead->pNext==ListHead)) return 1;
	else return 0;
}

UINT8 List_Destroy(List_t * const ListHead)
{
	List_t *p;
	Assert(ListHead);
	p =ListHead->pPrevious;
	while(!List_IsEmpty(p))
	{
		p=p->pPrevious;
		free(p->pNext);
		p->pNext=ListHead;
		ListHead->pPrevious=p;

	}
	return 0;
}

void List_Test()
{
	int i;
	List_t * List,*ListH,*ListE,*pList;

	printf("-----------------------------------------------\n");
	printf("------------Start List Test!------------------\n");
	printf("-----------------------------------------------\n");

	List=ListCreate();
	pList=List;
	printf("List Header address: %x, List->previous:%x, List->pNext:%x\n",List,List->pPrevious,List->pNext);
	ListH=(List_t *)malloc(sizeof(List_t));
	ListE=(List_t *)malloc(sizeof(List_t));
	//insert at end

    List_InsertHead(List,(List_t *)malloc(sizeof(List_t)));	//insert items
    List_InsertHead(List,(List_t *)malloc(sizeof(List_t)));
	List_InsertEnd(List,(List_t *)malloc(sizeof(List_t)));
	List_InsertEnd(List,(List_t *)malloc(sizeof(List_t)));

	printf("\n\ninsert items:\n");
	i=0;
	pList=List;
	while(pList->pNext!=List)  //show list items
	{
		printf("List[%d]=%x-> \n",i,pList);
		pList=pList->pNext;
		i++;
	}

	printf("\n\ndelete items:\n");
	i=0;
	pList=List;
	List_DeletEnd(List);		//delete items
	List_DeletHead(List);

	while(pList->pNext!=List)  //show list items
	{
		printf("List[%d]=%x-> \n",i,pList);
		pList=pList->pNext;
		i++;
	}

	//check empty
	//List_DeletEnd(List);		//delete items
	//List_DeletHead(List);

	//check empty
	printf("check empty :");
	if( List_IsEmpty(List)) printf("empty\n\n");
	else printf("not empty\n \n");

	//destroy list
	printf("destroy list \n");
	List_Destroy(List);

	//check empty
	printf("check empty :");
	if( List_IsEmpty(List)) printf("empty\n");
	else printf("not empty\n");

}

Cstyle的札记,Freertos内核详解,第2篇

时间: 2024-10-09 21:04:40

Cstyle的札记,Freertos内核详解,第2篇的相关文章

Cstyle的札记,Freertos内核详解,第3篇

<span style="white-space:pre"> </span>RTOS里面最常见的以及最核心的数据结构,队列的实现.可在VS2008 下编译测试. /** @file Copyright (c) 2008 - 2014, MX.Studio All rights reserved. Created by Cstyle **/ #ifndef _QUEUE_H_ #define _QUEUE_H_ #ifdef __cplusplus extern

Cstyle的札记,Freertos内核详解,基于cortex-m3,第0篇

Freertos是一个硬实时内核,支持众多的微处理器架构,我们可以从它的官网(www.freertos.ort)下载它的sourcecode,同时也可以看出它支持了几十种的微处理器架构,这些就不罗嗦了.之所以选择研究这个,是应为窥探RTOS内核的内幕一直每一个做底层软件开发人员的心愿,选择过好几种RTOS但他们有的是需要收费,有的不太成熟也不够系统,有的虽然比较成熟但是系统太大不太适合研究.而freertos就不同了,它除了包含RTOS所需要的基本的东西之外最大的特点就是开源+简单并且支持了非常

Cstyle的札记,Freertos内核详解,第1篇

一种动态内存管理Malloc/Free服务的链表实现 , 动态内存分配与回收服务,Malloc/Free的实现,最主要的核心内容是单向链表.其数据结构定义如下,一整段内存被SRAM或SDRAM,DRAM由系统的内存管理模块统一管理,这里主要是堆的管理: typedef struct A_BLOCK_LINK { struct A_BLOCK_LINK  *pxNextFreeBlock;     /*<< The next free block in the list. */ size_t x

jQuery内核详解与实践读书笔记1:原型技术分解2

上一篇已经搭建了一个非常简陋的jQuery框架雏形,如没有阅读搭建过程,请先阅读<jQuery内核详解与实践读书笔记1:原型技术分解1>初始搭建过程.接下来,完成书中介绍的剩下三个步骤: 7. 延续--功能扩展 jQuery框架是通过extend()函数来扩展功能的,extend()函数的功能实现起来也很简单,它只是吧指定对象的方法复制给jQuery对象或jQuery.prototype对象,如下示例代码就为jQuery类和原型定义了一个扩展功能的函数extend(). 1 var $ = j

jQuery内核详解与实践读书笔记1:原型技术分解1

一直以来都有研究一下jQuery源代码的想法,但是每次看到jQuery几千行的代码,头就大了,没有一点头绪,也不知道从哪里开始.昨天去图书馆无意间发现了这本<jQuery内核详解和实践>,翻看了一下里面的内容,这正是我寻觅多时剖析jQuery源码的好书. 废话不多说,直入正题吧.第一章介绍了一下jQuery的起步和一些历史故事,没什么重要内容.这里直接进入第二章,jQuery技术解密,从这一章开始就全部是干货了.这一章主要分四部分:jQuery原型技术分解,破解jQuery选择器接口,解析jQ

ANDROID L——Material Design详解(动画篇)

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lollipop(5.0). 前几天发现Android5.0正式版的sdk已经可以下载了,而且首次搭载Android L系统的Nexus 6和 Nexus 9也即将上市. 所以是时候开始学习Android L了! 关于Android L如何配置模拟器和创建项目,如果大家有兴趣的话可以看看我之前的一篇文章: A

TCP协议详解(理论篇)

TCP协议详解(理论篇) 1.    与UDP不同的是,TCP提供了一种面向连接的.可靠的字节流服务.面向连接比较好理解,就是连接双方在通信前需要预先建立一条连接,这犹如实际生活中的打电话.助于可靠性,TCP协议中涉及了诸多规则来保障通信链路的可靠性,总结起来,主要有以下几点: (1)应用数据分割成TCP认为最适合发送的数据块.这部分是通过"MSS"(最大数据包长度)选项来控制的,通常这种机制也被称为一种协商机制,MSS规定了TCP传往另一端的最大数据块的长度.值得注意的是,MSS只能

Spark 性能相关参数配置详解-shuffle篇

作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 随着Spark的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 在Spark的官方文档http://spark.apache.org/docs/latest/configuration.html 中提供了这些可配置参数中相当大一部分的说明. 但是文档的更新总是落后于代码的开发的, 还有一些配置参数没有来得及被添加到

[转]ANDROID L——Material Design详解(动画篇)

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 转自:http://blog.csdn.net/a396901990/article/details/40187203 Android L: Google已经确认Android L就是Android Lollipop(5.0). 前几天发现Android5.0正式版的sdk已经可以下载了,而且首次搭载Android L系统的Nexus 6和 Nexus 9也即将上市. 所以是时候开始学习