Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 阻塞在开关盒内_C++_If Statement_Switch Statement_Freertos - Fatal编程技术网

C++ 阻塞在开关盒内

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

在一个运行freertos的嵌入式系统上,有什么理由不在switch语句中使用阻塞函数

例如,一个线程在状态机中运行,其中一个状态是等待任务通知

通常我是用if-else做这件事的,但是把它做成开关盒有什么优点或缺点吗

使用cpp17并避免STL

编辑:阻止函数,即在收到通知之前一直保持不变的函数,如xTaskNotifyWait(…)

例如:

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语句应该是一个快速的进出语句,但我不知道为什么。我怀疑它不是建立在任何基础上的,也没有真正的理由说明你不应该在一个开关柜内阻塞。如果它回答了你的问题,别忘了接受它!谢谢