Open
Description
I'm using freertos, and I have a task listening serial messages. When the rx buffer is empty, I want the task to be blocked, or "sleep", and a rx callback will return the task to running state after several bytes have arrived. Otherwise the listening task will constantly occupies CPU time, leaves no process opportunity for other tasks, unless the priority of the task is low enough.
The callback function would be like:
void rx_callback(HardwareSerial *serial_instance) {
if(serial_instance->available() > 5) {
if( the_task_is_blocked_waiting_message ) {
wake_up_the_task();
}
}
}
It would be more convenient to define the rx_callback function as:
void rx_callback(HardwareSerial *serial_instance, void * ptr_to_callback_object) {
if(serial_instance->available() > 5) {
if( the_task_is_blocked_waiting_message ) {
auto *ptr = reinterpret_cast<CallbackObjectType*>(ptr_to_callback_obejct)
ptr->wake_up_the_task();
}
}
}
The value of ptr_to_callback_object
is stored in a member of HardwareSerial. This way, the callback function can directly get the handle to the task. And the code of callback function can be reused in different projects without modification.
Metadata
Metadata
Assignees
Labels
Type
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
fpistm commentedon Apr 8, 2025
Hi @marshfolx
Feel free to provide a PR then it could be reviewed and discussed.