Concurrency Method Design Pattern

Concurrency in embedded systems is often crucial to efficiently handle multiple tasks or events concurrently. One common approach is to use a Real-Time Operating System (RTOS) or a simple scheduler for task management.

Concurrency Method Design Pattern is used for Operating System, it is helpfull for single and multiple task, task may be synchronous and asynchronus. Let suppose if there is any user send the request and there is multiple request, so let suppose when there is thread1 goes for task then thread2 have to wait. So waiting period of the other task it takes some time to execute other. In this process we can use the Concurrency Method.

Problem Statement of Concurrency Method Design Pattern

In the above example of a simple concurrency pattern in embedded C using a cooperative multitasking approach without an RTOS. In this example, tasks are executed in a round-robin fashion.

C




#include <stdio.h>
#include <stdint.h>
 
// Define task function signatures
typedef void (*TaskFunction)(void);
 
// Define the task structure
typedef struct {
    TaskFunction function;
    uint32_t interval;  // Time between task executions
    uint32_t lastExecutionTime;
} Task;
 
// Example tasks
void task1(void) {
    printf("Task 1 executed\n");
}
 
void task2(void) {
    printf("Task 2 executed\n");
}
 
void task3(void) {
    printf("Task 3 executed\n");
}
 
// Array of tasks
Task tasks[] = {
    {task1, 1000, 0},  // Task 1 runs every 1000 milliseconds
    {task2, 500, 0},   // Task 2 runs every 500 milliseconds
    {task3, 2000, 0},  // Task 3 runs every 2000 milliseconds
};
 
// Number of tasks
#define NUM_TASKS (sizeof(tasks) / sizeof(Task))
 
// Simple scheduler
void scheduler(void) {
    // Get the current time (in a real system, this would be a timer value)
    uint32_t currentTime = 0;  // Replace this with actual timer value
 
    for (int i = 0; i < NUM_TASKS; ++i) {
        Task *currentTask = &tasks[i];
 
        // Check if it's time to execute the task
        if ((currentTime - currentTask->lastExecutionTime) >= currentTask->interval) {
            // Execute the task
            currentTask->function();
 
            // Update the last execution time
            currentTask->lastExecutionTime = currentTime;
        }
    }
}
 
int main() {
    // In a real system, this loop would run indefinitely
    for (int i = 0; i < 10; ++i) {
        // Simulate the passage of time
        // In a real system, this would be handled by interrupts or a timer
        // Here, we just increment the time variable for simplicity
        scheduler();
    }
 
    return 0;
}


Explanation of the above Code:

  • In this example demonstrates a simple scheduler that iterates over an array of tasks, checks if each task should be executed based on its interval, and then executes it if needed.
  • The tasks run in a cooperative manner, meaning each task must yield control to the scheduler voluntarily. In a real-world scenario, this could be implemented using timer interrupts or a more sophisticated scheduler in an RTOS.

Design Patterns for Embedded Systems in C

When working with embedded systems in C, there are so many design patterns that are particularly very useful. Many design patterns can be applied to embedded systems development in C. In this article, we will discuss design patterns for Embedded Systems in C, let’s see all of them one by one with the help of examples.

Important Topics for Design Patterns for Embedded Systems in C

  • What is a Design Pattern?
  • Creational Design Patterns for Embedded Systems in C
    • Factory Method Design Pattern
    • Object Method Design Pattern
    • Opaque Method Design Pattern
    • Singleton Method Design Pattern
  • Structural Design Patterns for Embedded Systems in C
    • Callback Method Design Patterns
    • Inheritance Method Design Pattern
    • Virtual API Method Design Pattern
  • Other Design Patterns for Embedded System in C
    • Bridge Method Design Pattern
    • Concurrency Method Design Pattern
    • Spinlock Method Design Pattern
    • Mutex Method Design Pattern
    • Conditional Method Design Pattern
    • Behavioral Method Design Pattern

Similar Reads

1. What is a Design Pattern?

Design patterns are defined as the general reusable solutions to the common problems that occur during software development and software designing....

2. Creational Design Pattern for Embedded Systems in C

In embedded systems development in C, creational design patterns are used to abstract the instantiation process of objects, providing flexibility in creating and configuring objects....

2.1 Factory Method Design Pattern

One commonly used creational design pattern is the Factory Method Pattern. Let’s see an example of how we can implement the Factory Method Pattern in C for an embedded system:...

2.2 Object Method Design Pattern

...

2.3 Opaque Method Design Pattern

In the embedded systems programming in C, the Object Pattern is typically implemented using structures and functions that operate on those structures. While C does not have native support for object-oriented programming....

2.4 Singleton Method Design Pattern

...

3. Structural Design Patterns for Embedded Systems in C

In the embedded systems programming, an opaque pattern is often used to hide the implementation details of a data structure or module from the outside world. This helps in encapsulating the internal details, providing a clean interface, and enhancing code maintainability....

3.1 Callback Method Design Patterns

...

3.2 Inheritance Method Design Pattern

...

3.3 Virtual API Method Design Pattern

The Singleton Pattern is basically a type of design pattern that restricts the instantiation of a class to a single instance and provides a global point of access to that instance. This pattern is often used to control access to resources such as databases, file systems, or network connections....

4. Other Design Patterns for Embedded System in C

...

4.1 Bridge Method Design Pattern

Structural design patterns in embedded systems help to organize and structure the code in a way that makes it more modular, flexible, and easier to maintain....

4.2 Concurrency Method Design Pattern

The callback pattern in embedded systems is a design pattern where a function (callback function) is registered to be called later when a specific event or condition occurs....

4.3 Spinlock Method Design Pattern

...

4.4 Mutex Method Design Pattern

In embedded systems programming with C, inheritance is not directly supported as it is in some object-oriented languages like C++....

4.5 Conditional Method Design Pattern

...

4.6 Behavioral Method Design Pattern

The Virtual API design pattern, sometimes called the Virtual Function Table (VFT) pattern, is a valuable technique in embedded C programming for providing a common interface to different implementations of the same functionality....

Conclusion

...

Contact Us