双向链表RT-Thread篇14

Posted:   2020-09-10

Status:   Completed

Tags :   STM32 RTOS RT-Thread

Categories :   STM32 RTOS RT-Thread

Previous:   中断管理RT-Thread篇13

Next:   STM32标准外设库SPI读写FLASH SPL篇18


双向链表常用函数

  • 链表初始化void rt_list_init(rt_list_t *l)
  • 向链表指定节点后面插入节点void rt_list_insert_after(rt_list_t *l,rt_list_t *n)
  • 向链表指定节点前面插入节点void rt_list_insert_before(rt_list_t *l,rt_list_t *n)
  • 从链表删除节点函数void rt_list_remove(rt_list_t *n)
  • 链表是否为空int rt_list_isempty(const rt_list_t *l)

双向链表

  • 修改main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "rtthread.h"
#include "main.h"

/*
*************************************************************************
*                               变量
*************************************************************************
*/
/* 定义线程控制块 */
static rt_thread_t test1_thread = RT_NULL;
static rt_thread_t test2_thread = RT_NULL;;


/*
*************************************************************************
*                             函数声明
*************************************************************************
*/
static void test1_thread_entry(void* parameter);
static void test2_thread_entry(void* parameter);

/************************* 全局变量声明 ****************************/


int main(void)
{

    test1_thread =                          /* 线程控制块指针 */
        rt_thread_create( "test1",              /* 线程名字 */
                          test1_thread_entry,   /* 线程入口函数 */
                          RT_NULL,             /* 线程入口函数参数 */
                          512,                 /* 线程栈大小 */
                          2,                   /* 线程的优先级 */
                          20);                 /* 线程时间片 */

    /* 启动线程,开启调度 */
    if (test1_thread != RT_NULL)
        rt_thread_startup(test1_thread);
    else
        return -1;

    test2_thread =                          /* 线程控制块指针 */
        rt_thread_create( "test2",              /* 线程名字 */
                          test2_thread_entry,   /* 线程入口函数 */
                          RT_NULL,             /* 线程入口函数参数 */
                          512,                 /* 线程栈大小 */
                          3,                   /* 线程的优先级 */
                          20);                 /* 线程时间片 */

    /* 启动线程,开启调度 */
    if (test2_thread != RT_NULL)
        rt_thread_startup(test2_thread);
    else
        return -1;
}
/**
 * @brief  test1_thread线程主体
 * @param  parameter 参数
 * @retval 无
 */
static void test1_thread_entry(void* parameter)
{
    rt_list_t *head;  /* 定义一个双向链表的头节点 */
    rt_list_t *node1;  /* 定义一个双向链表的头节点 */
    rt_list_t *node2;  /* 定义一个双向链表的头节点 */

    head = rt_malloc(sizeof(rt_list_t));/* 申请动态内存 */
    if(RT_NULL == head)/* 没有申请成功 */
        rt_kprintf("malloc fail\n");
    else
      rt_kprintf("malloc suceess,addr:%d!\n",head);

    rt_kprintf("\nlist......\n");
    rt_list_init(head);
    if(rt_list_isempty(head))
        rt_kprintf("list success!\n\n");

    /* 插入节点:顺序插入与从末尾插入 */
    rt_kprintf("list insert......\n");
    /* 动态申请第一个结点的内存 */
    node1 = rt_malloc(sizeof(rt_list_t));
    /* 动态申请第二个结点的内存 */
    node2 = rt_malloc(sizeof(rt_list_t));

    rt_kprintf("insert.....\n");
    /* 因为这是在某个节点后面添加一个节点函数
       为后面的rt_list_insert_before(某个节点之前)
       添加节点做铺垫,两个函数添加完之后的顺序是
       head -> node1 -> node2 */
    rt_list_insert_after(head,node2);
    rt_list_insert_before(node2,node1);
    if ((node1->prev == head) && (node2->prev == node1))
        rt_kprintf("insert success!\n\n");
    else
        rt_kprintf("insert fail!\n\n");

    rt_kprintf("delete......\n");	/* 删除已有节点 */
    rt_list_remove(node1);
    rt_free(node1);/* 释放第一个节点的内存 */
    if (node2->prev == head)
        rt_kprintf("delete success\n\n");

    /* 任务都是一个无限循环,不能返回 */
    while(1)
    {
        LED1_TOGGLE;
        rt_thread_delay(500);     //每500ms扫描一次
    }
}

static void test2_thread_entry(void* parameter)
{

    /* 任务都是一个无限循环,不能返回 */
    while (1)
    {
        rt_kprintf("running\n");
        LED2_TOGGLE;
        rt_thread_delay(1000);     //每1000ms扫描一次
    }
}

调试

  • 编译下载到开发板
  • 在串口助手中可以看到接收到消息