Skip to content

ThisThread::flags_wait_any_for has wrong flags in implementation #53

Open
@philrittenhouse

Description

@philrittenhouse

Description of defect

I ran into a problem where flags_wait_any_for() is waiting for all specified flags to be set instead of all. Looking at the code in SparkFun\hardware\apollo3\2.2.1\cores\mbed-os\rtos\source\ThisThread.cpp, I think the problem is the use of the osFlagsWaitAll flag instead of osFlagsWaitAny here:

uint32_t ThisThread::flags_wait_any_for(uint32_t flags, Clock::duration_u32 rel_time, bool clear)
{
    return flags_wait_for(flags, rel_time, clear, osFlagsWaitAll);
}

I noticed that in the Sparkfun/mbed-os-ambiq-apollo3 github repo this seems to have been fixed 2 years ago:
https://github.com/sparkfun/mbed-os-amb ... 31e548eb38

I guess the fix didn't make it over to the Arduino version.

Target(s) affected by this defect ?

All Sparkfun Artemis boards using this library.

Toolchain(s) (name and version) displaying this defect ?

Arduino

What version of Mbed-os are you using (tag or sha) ?

Sparkfun Arduino Apollo3 board driver version 2.2.1

What version(s) of tools are you using. List all that apply (E.g. mbed-cli)

Arduino 1.8.16

How is this defect reproduced ?

The following program will fail to wake up because it is waiting for all flags to be set instead of any:

#define STATUS_COUNT_TOTAL (10)
#define GO_FLAG     1

rtos::Thread thread;  

void thread_fn( void ){             // create a function to run as a thread
  Serial.begin(115200);                   // perform setup related to this thread
  Serial.print("Apollo3 - Threads\n\n");
  uint32_t flags;
  rtos::Kernel::Clock::duration_u32 sleep_time;

  uint8_t status_count = 0;
  while(status_count < STATUS_COUNT_TOTAL)
  {

    Serial.println("Thread waiting for flag...");

    sleep_time = rtos::Kernel::wait_for_u32_forever;
    //flags = rtos::ThisThread::flags_wait_any_for(GO_FLAG, sleep_time, true);
    flags = rtos::ThisThread::flags_wait_any_for(GO_FLAG|4, sleep_time, true);
    Serial.printf("wait returned flags = 0x%x\n", flags);
    
    Serial.printf("time (ms): %d, status count: %d\n", millis(), status_count++);
  }

  Serial.print("Stopping status thread\n");
  Serial.end();                           // de-initialiaze for this thread
}

// setup() and loop() run within the function main() which is the first thread
void setup() {
  thread.start(thread_fn);          // assign thread_fn to the object thread and begin execution
}

void loop() {

  delay(2000);
  if (osFlagsError == thread.flags_set(GO_FLAG))
  {
    Serial.println("Failed to set flag!!!");
  }
  Serial.println("Flag set");
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions