线程的切换
什么是線程
首先講一下進程與線程的區別:
1、一個程序就是一個進程,一個程序中的多個任務稱為線程
2、一個線程只能屬于一個進程,一個進程可以有多個線程
3、線程是操作系統可識別的最小執行和調度單位
4、多線程可提高效率
線程的切換
首先看一下裸機系統實現兩個變量輪流翻轉
uint32_t flag1; uint32_t flag2;void delay(uint32_t count) {for(; count!=0; count--); }int main(void) {for(; ;){flag1 = 1;delay(100);flag1 = 0;delay(100); flag2 = 1;delay(100);flag2 = 0;delay(100); } }flag1、flag2必須定義成全局變量才能添加到邏輯分析儀里面觀察波形
flag1、flag2在邏輯分析儀中設置成bit的模式才能看到波形,不能用默認的模擬量
代碼仿真圖如下:
?在多線程中,兩個線程不斷切換的效果圖如下:
?兩個變量的波形是完全一樣的,就好像CPU同時在干兩件事情一樣,這才是多線程的意義。雖然兩者的波形圖一樣,但代碼的實現方式完全不一樣,由原來的順序執行變成了主動切換,這是根本區別。
代碼如下:
#include <rtthread.h> #include "ARMCM3.h"/* ************************************************************************* * 全局變量 ************************************************************************* */ rt_uint8_t flag1; rt_uint8_t flag2;extern rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];/* ************************************************************************* * 線程控制塊 & STACK & 線程聲明 ************************************************************************* *//* 定義線程控制塊 */ struct rt_thread rt_flag1_thread; struct rt_thread rt_flag2_thread;ALIGN(RT_ALIGN_SIZE) /* 定義線程棧 */ rt_uint8_t rt_flag1_thread_stack[512]; rt_uint8_t rt_flag2_thread_stack[512];/* 線程聲明 */ void flag1_thread_entry(void *p_arg); void flag2_thread_entry(void *p_arg);/* ************************************************************************* * 函數聲明 ************************************************************************* */ void delay(uint32_t count);/************************************************************************* @brief main函數* @param 無* @retval 無** @attention*********************************************************************** */ int main(void) { /* 硬件初始化 *//* 將硬件相關的初始化放在這里,如果是軟件仿真則沒有相關初始化代碼 */ /* 調度器初始化 */rt_system_scheduler_init();/* 初始化線程 */rt_thread_init( &rt_flag1_thread, /* 線程控制塊 */flag1_thread_entry, /* 線程入口地址 */RT_NULL, /* 線程形參 */&rt_flag1_thread_stack[0], /* 線程棧起始地址 */sizeof(rt_flag1_thread_stack) ); /* 線程棧大小,單位為字節 *//* 將線程插入到就緒列表 */rt_list_insert_before( &(rt_thread_priority_table[0]),&(rt_flag1_thread.tlist) );/* 初始化線程 */rt_thread_init( &rt_flag2_thread, /* 線程控制塊 */flag2_thread_entry, /* 線程入口地址 */RT_NULL, /* 線程形參 */&rt_flag2_thread_stack[0], /* 線程棧起始地址 */sizeof(rt_flag2_thread_stack) ); /* 線程棧大小,單位為字節 *//* 將線程插入到就緒列表 */rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );/* 啟動系統調度器 */rt_system_scheduler_start(); }/* ************************************************************************* * 函數實現 ************************************************************************* */ /* 軟件延時 */ void delay (uint32_t count) {for(; count!=0; count--); }/* 線程1 */ void flag1_thread_entry( void *p_arg ) {for( ;; ){flag1 = 1;delay( 100 ); flag1 = 0;delay( 100 );/* 線程切換,這里是手動切換 */ rt_schedule();} }/* 線程2 */ void flag2_thread_entry( void *p_arg ) {for( ;; ){flag2 = 1;delay( 100 ); flag2 = 0;delay( 100 );/* 線程切換,這里是手動切換 */rt_schedule();} }線程控制塊類型聲明:
struct rt_thread {void *sp; /* 線程棧指針 */void *entry; /* 線程入口地址 */void *parameter; /* 線程形參 */ void *stack_addr; /* 線程起始地址 */rt_uint32_t stack_size; /* 線程棧大小,單位為字節 */rt_list_t tlist; /* 線程鏈表節點 */ }; typedef struct rt_thread *rt_thread_t;總結
- 上一篇: 日常实用网站推荐
- 下一篇: 如何利用python实现自动签到