微控制器中的多线程
Multithreading in microcontrollers
我有一个在线程之间共享的 volatile unsigned char array LedState[5]
变量。数组中的每个索引表示一个状态。根据每个状态,LED 将以不同的顺序闪烁。一个线程设置数组中的状态,另一个基于数组索引的线程将闪烁 LED。
void TurnOnled(state) {
LedState[state] =1;
}
void TurnOffLed(state) {
LedState[state] = 0;
}
int CheckLedState(state) {
return LedState[state]? 1 : 0;
}
Thread 1
---------
TurnOnLed(3);
/*Set of instructions*/
TurnOffLed(3);
Thread 2
--------
if (CheckLedState(3)) {
/*Flash LEDS according to state*/
else {/*do nothing*/}
我的问题有时在线程 1 中,我需要立即 TurnOnLed
和 TurnOffLed
。如何确保线程 2 在调用 TurnOffLed
之前看到 TurnOnLed
。上面只是一个简单的例子,但实际上 LedState 变量是从多个线程设置和取消设置的。但是不同的线程不会设置相同的状态。
您必须为每个 LED 使用一个信号量,Set 函数设置该信号量,并且读取函数在获得状态后关闭。 set 函数应该只在信号量清除时改变状态。例如:
char LedState[5];
char LedSema [5];
void TurnOnled(state) {
while (LedSema[state]) { /* wait until earlier change processed */ ; }
LedState[state]= 1; /* turn LED on */
LedSema [state]= 1; /* indicate state change */
}
void TurnOffLed(state) {
while (LedSema[state]) { /* wait until earlier change processed */ ; }
LedState[state]= 0; /* turn LED off */
LedSema [state]= 1; /* indicate state change */
}
//Thread 1
//---------
TurnOnLed(3);
/*Set of instructions*/
TurnOffLed(3);
//Thread 2
//--------
if (LedSema[3]==1) {
/* a change occured */
if (LedState[3]) {
/* turn on LED */
}
else {
/* turn off LED */
}
LedSema[3]=0; /* indicate change processed */
}
我有一个在线程之间共享的 volatile unsigned char array LedState[5]
变量。数组中的每个索引表示一个状态。根据每个状态,LED 将以不同的顺序闪烁。一个线程设置数组中的状态,另一个基于数组索引的线程将闪烁 LED。
void TurnOnled(state) {
LedState[state] =1;
}
void TurnOffLed(state) {
LedState[state] = 0;
}
int CheckLedState(state) {
return LedState[state]? 1 : 0;
}
Thread 1
---------
TurnOnLed(3);
/*Set of instructions*/
TurnOffLed(3);
Thread 2
--------
if (CheckLedState(3)) {
/*Flash LEDS according to state*/
else {/*do nothing*/}
我的问题有时在线程 1 中,我需要立即 TurnOnLed
和 TurnOffLed
。如何确保线程 2 在调用 TurnOffLed
之前看到 TurnOnLed
。上面只是一个简单的例子,但实际上 LedState 变量是从多个线程设置和取消设置的。但是不同的线程不会设置相同的状态。
您必须为每个 LED 使用一个信号量,Set 函数设置该信号量,并且读取函数在获得状态后关闭。 set 函数应该只在信号量清除时改变状态。例如:
char LedState[5];
char LedSema [5];
void TurnOnled(state) {
while (LedSema[state]) { /* wait until earlier change processed */ ; }
LedState[state]= 1; /* turn LED on */
LedSema [state]= 1; /* indicate state change */
}
void TurnOffLed(state) {
while (LedSema[state]) { /* wait until earlier change processed */ ; }
LedState[state]= 0; /* turn LED off */
LedSema [state]= 1; /* indicate state change */
}
//Thread 1
//---------
TurnOnLed(3);
/*Set of instructions*/
TurnOffLed(3);
//Thread 2
//--------
if (LedSema[3]==1) {
/* a change occured */
if (LedState[3]) {
/* turn on LED */
}
else {
/* turn off LED */
}
LedSema[3]=0; /* indicate change processed */
}