C++ 阻塞在开关盒内
在一个运行freertos的嵌入式系统上,有什么理由不在switch语句中使用阻塞函数 例如,一个线程在状态机中运行,其中一个状态是等待任务通知 通常我是用if-else做这件事的,但是把它做成开关盒有什么优点或缺点吗 使用cpp17并避免STL 编辑:阻止函数,即在收到通知之前一直保持不变的函数,如xTaskNotifyWait(…) 例如:C++ 阻塞在开关盒内,c++,if-statement,switch-statement,freertos,C++,If Statement,Switch Statement,Freertos,在一个运行freertos的嵌入式系统上,有什么理由不在switch语句中使用阻塞函数 例如,一个线程在状态机中运行,其中一个状态是等待任务通知 通常我是用if-else做这件事的,但是把它做成开关盒有什么优点或缺点吗 使用cpp17并避免STL 编辑:阻止函数,即在收到通知之前一直保持不变的函数,如xTaskNotifyWait(…) 例如: switch (state) { case state1: foo(); break; case state2: xTaskNotifyWa
switch (state)
{
case state1:
foo();
break;
case state2:
xTaskNotifyWait(...);
};
vs
TIA您可以使用
开关或if
语句。没什么区别。您可以在其中任何一个中进行阻塞调用
我听说交换案例使用哈希表,但如果其他案例不使用的话。我不确定asm代码中是否存在差异,以及这会对代码大小、速度等产生什么影响
请参阅以了解switch和if语句之间的区别。我引述以下其中一个答案:
主要区别在于交换机会立即发送到相关案例,通常是通过索引跳转,而不必评估if-else链中需要的所有条件,这意味着到达链末尾的代码比到达链开头的代码要慢
这反过来又对switch语句施加了if-else链没有的一些限制:它不能处理所有数据类型,所有case值都必须是常量
使用switch构造,您可以对案例标签使用描述性的enum
,该标签表示此状态为阻塞
。我个人会使用开关
构造,因为案例标签可以是描述性的
enum state_e {
INIT,
WAITING_FOR_EVENT
};
switch (state) {
case INIT:
{
foo();
state = WAITING_FOR_EVENT;
break;
}
case WAITING_FOR_EVENT:
{
xTaskNotifyWait(...);
// Change State
break;
}
};
您可以使用开关
或if
语句。没什么区别。您可以在其中任何一个中进行阻塞调用
我听说交换案例使用哈希表,但如果其他案例不使用的话。我不确定asm代码中是否存在差异,以及这会对代码大小、速度等产生什么影响
请参阅以了解switch和if语句之间的区别。我引述以下其中一个答案:
主要区别在于交换机会立即发送到相关案例,通常是通过索引跳转,而不必评估if-else链中需要的所有条件,这意味着到达链末尾的代码比到达链开头的代码要慢
这反过来又对switch语句施加了if-else链没有的一些限制:它不能处理所有数据类型,所有case值都必须是常量
使用switch构造,您可以对案例标签使用描述性的enum
,该标签表示此状态为阻塞
。我个人会使用开关
构造,因为案例标签可以是描述性的
enum state_e {
INIT,
WAITING_FOR_EVENT
};
switch (state) {
case INIT:
{
foo();
state = WAITING_FOR_EVENT;
break;
}
case WAITING_FOR_EVENT:
{
xTaskNotifyWait(...);
// Change State
break;
}
};
请给我们看一下你的代码?请定义“阻塞函数”。case开关中的阻塞函数应该是什么意思?不,没有理由避免在switch语句中阻塞函数调用。xTaskNotifyWait()请向我们展示您的代码?请定义“阻塞函数”。case开关中的阻塞函数应该是什么意思?不,没有理由避免在switch语句中阻塞函数调用。例如。非常感谢,我一直被告知switch语句应该是一个快速的、进出的语句,但我不知道为什么。我怀疑它不是建立在任何基础上的,也没有真正的理由说明你不应该在一个开关柜内阻塞。如果它回答了你的问题,别忘了接受它!非常感谢谢谢,我一直被告知,switch语句应该是一个快速的进出语句,但我不知道为什么。我怀疑它不是建立在任何基础上的,也没有真正的理由说明你不应该在一个开关柜内阻塞。如果它回答了你的问题,别忘了接受它!谢谢