基於STM32的虛擬多執行緒

2021-08-14 03:47:44 字數 4003 閱讀 2593

基於stm32的虛擬多執行緒,可以很好的用於裸機程式中,用於模擬小型作業系統的多執行緒概念。本例項參考了參考ti_ble協議棧_zstack協議棧。

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

123

124

125

126

127

128

129

#include

"hal_led/hal_led.h"

#include

"hal_delay/delay.h"

#include

"hal_key/hal_key.h"

#include

"ringbuffer.h"

#define hal_led1_blink_event   0x0001

#define task_no_task_running      0xff

unsigned

short hal_processevent( 

unsigned

char task_id, 

unsigned

short events );

unsigned

unsigned

char task_id, 

unsigned

short events );

typedef

unsigned

short  uint16;

typedef

unsigned

char   uint8;

#define task_cnt  

2//定義執行緒的個數

//定義函式指標

typedef

unsigned

short (*ptaskeventhandlerfn)( 

unsigned

char task_id, 

unsigned

short events );

//執行緒函式表

const ptaskeventhandlerfn tasksarr =

;

const

unsigned

char taskscnt = 

sizeof( tasksarr ) / 

sizeof( tasksarr[

0] );

//uint16 *tasksevents;

uint16 tasksevents[task_cnt] = ;  

//每個執行緒有16位位域空間用於設定事件

static uint8 activetaskid = 0xff;  

//當前任務id,指示作用

#define success                   0x00

#define failure                   0x01

#define invalid_task              0x02

uint8 osal_set_event( uint8 task_id, uint16 event_flag )

else

}

/*** @brief 程式入口

* @param none

* @return none

*/int main(

void)

}

while (++idx < taskscnt);

if (idx < taskscnt)

delayms(

1000);

}

}

/*** @brief 應用層處理

* @param none

* @r

*/unsigned

short hal_processevent( 

unsigned

char task_id, 

unsigned

short events )

}

/*** @brief 硬體控制線程

* @param none

* @r

*/unsigned

unsigned

char task_id, 

unsigned

short events )

}

基於STM32的串列埠通訊

序列通訊一般是以幀格式傳輸資料,即一幀一幀的傳輸,每一幀都含有起始訊號,資料資訊以及停止資訊等。資料各個位同時傳輸,速度快,但是占用引腳資源多。eg led1602 資料按位順序傳輸,占用引腳資源少,但是速度相對較慢。一位一位傳輸 bit iic spi 串列埠通訊 單工,半雙工,全雙工 同步通訊 ...

基於STM32的恆流源設計

本設計以stm32f103rct6為主控晶元,利用mos管的恆流區特點,設計恆流源。設計電流範圍為1 300ma。基本原理圖 q2為n溝道mos管,在正常工作情況下,運放與mos管之間構成深度負反饋,使得輸入控制電壓與vr虛短,近似相等。這可以得到負載電流 3.1.電源 電路圖如圖所示 電源由 12...

linux spi驅動分析 基於STM32

linux kernel 版本2.6.30,spi驅動基於platform device,platform driver驅動模型來編寫.spi分為主從裝置,乙個主裝置下可心掛接多個從裝置,linux驅動中使用struct spi master結構來表示乙個主裝置,使用struct spi devic...