日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程的切换

發(fā)布時間:2024/1/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程的切换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是線程

首先講一下進程與線程的區(qū)別:

1、一個程序就是一個進程,一個程序中的多個任務稱為線程

2、一個線程只能屬于一個進程,一個進程可以有多個線程

3、線程是操作系統(tǒng)可識別的最小執(zhí)行和調(diào)度單位

4、多線程可提高效率

線程的切換

首先看一下裸機系統(tǒng)實現(xiàn)兩個變量輪流翻轉(zhuǎn)

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同時在干兩件事情一樣,這才是多線程的意義。雖然兩者的波形圖一樣,但代碼的實現(xiàn)方式完全不一樣,由原來的順序執(zhí)行變成了主動切換,這是根本區(qū)別。

代碼如下:

#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);/* ************************************************************************* * 函數(shù)聲明 ************************************************************************* */ void delay(uint32_t count);/************************************************************************* @brief main函數(shù)* @param 無* @retval 無** @attention*********************************************************************** */ int main(void) { /* 硬件初始化 *//* 將硬件相關的初始化放在這里,如果是軟件仿真則沒有相關初始化代碼 */ /* 調(diào)度器初始化 */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) ); /* 線程棧大小,單位為字節(jié) *//* 將線程插入到就緒列表 */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) ); /* 線程棧大小,單位為字節(jié) *//* 將線程插入到就緒列表 */rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );/* 啟動系統(tǒng)調(diào)度器 */rt_system_scheduler_start(); }/* ************************************************************************* * 函數(shù)實現(xiàn) ************************************************************************* */ /* 軟件延時 */ 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; /* 線程棧大小,單位為字節(jié) */rt_list_t tlist; /* 線程鏈表節(jié)點 */ }; typedef struct rt_thread *rt_thread_t;

總結(jié)

以上是生活随笔為你收集整理的线程的切换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。