Skip to content

Commit 774f6c4

Browse files
[Silabs] Continue Migration to CMSIS OS2 api (project-chip#32901)
* Migrate pw rpc support to cmsis os api * Migration efr32 uart.cpp to cmsis os
1 parent a9e3b0a commit 774f6c4

File tree

5 files changed

+73
-81
lines changed

5 files changed

+73
-81
lines changed

examples/common/pigweed/efr32/PigweedLoggerMutex.h

+5-6
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020

2121
#include "PigweedLogger.h"
2222
#include "pigweed/RpcService.h"
23-
#include "semphr.h"
24-
#include <FreeRTOS.h>
23+
#include <cmsis_os2.h>
2524

2625
namespace chip {
2726
namespace rpc {
@@ -32,18 +31,18 @@ class PigweedLoggerMutex : public ::chip::rpc::Mutex
3231
PigweedLoggerMutex() {}
3332
void Lock() override
3433
{
35-
SemaphoreHandle_t * sem = PigweedLogger::GetSemaphore();
34+
osMutexId_t * sem = PigweedLogger::GetMutex();
3635
if (sem)
3736
{
38-
xSemaphoreTake(*sem, portMAX_DELAY);
37+
osMutexAcquire(*sem, osWaitForever);
3938
}
4039
}
4140
void Unlock() override
4241
{
43-
SemaphoreHandle_t * sem = PigweedLogger::GetSemaphore();
42+
osMutexId_t * sem = PigweedLogger::GetMutex();
4443
if (sem)
4544
{
46-
xSemaphoreGive(*sem);
45+
osMutexRelease(*sem);
4746
}
4847
}
4948
};

examples/platform/silabs/PigweedLogger.cpp

+9-12
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,13 @@
2424
* needs to use HDLC/UART for another purpose like the RPC server.
2525
*/
2626

27-
#include <FreeRTOS.h>
28-
29-
#include "semphr.h"
30-
#include <pw_hdlc/encoder.h>
31-
#include <pw_stream/sys_io_stream.h>
32-
#include <pw_sys_io_efr32/init.h>
33-
27+
#include "PigweedLogger.h"
3428
#include "pw_span/span.h"
3529
#include <cassert>
3630
#include <cstdint>
31+
#include <pw_hdlc/encoder.h>
32+
#include <pw_stream/sys_io_stream.h>
33+
#include <pw_sys_io_efr32/init.h>
3734
#include <string_view>
3835

3936
namespace PigweedLogger {
@@ -44,7 +41,7 @@ constexpr size_t kWriteBufferSize = 128; // Buffer for constructing HDLC frames
4441

4542
// Exclusive access to the backend is needed to make sure that log messages coming
4643
// from different threads are not interwoven.
47-
SemaphoreHandle_t sLoggerLock;
44+
osMutexId_t sLoggerLock;
4845

4946
static pw::stream::SysIoWriter sWriter;
5047
static size_t sWriteBufferPos;
@@ -60,15 +57,15 @@ static void send(void)
6057

6158
void init(void)
6259
{
63-
sLoggerLock = xSemaphoreCreateMutex();
60+
sLoggerLock = osMutexNew(nullptr);
6461
assert(sLoggerLock != NULL);
6562

6663
pw_sys_io_Init();
6764
}
6865

6966
int putString(const char * buffer, size_t size)
7067
{
71-
xSemaphoreTake(sLoggerLock, portMAX_DELAY);
68+
osMutexAcquire(sLoggerLock, osWaitForever);
7269
assert(sWriteBufferPos < kWriteBufferSize);
7370

7471
for (size_t i = 0; i < size; ++i)
@@ -90,11 +87,11 @@ int putString(const char * buffer, size_t size)
9087
send();
9188
}
9289

93-
xSemaphoreGive(sLoggerLock);
90+
osMutexRelease(sLoggerLock);
9491
return size;
9592
}
9693

97-
SemaphoreHandle_t * GetSemaphore()
94+
osMutexId_t * GetMutex()
9895
{
9996
return &sLoggerLock;
10097
}

examples/platform/silabs/PigweedLogger.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,13 @@
1717

1818
#pragma once
1919

20-
#include <FreeRTOS.h>
21-
22-
#include "semphr.h"
20+
#include <cmsis_os2.h>
2321
#include <cstdint>
2422

2523
namespace PigweedLogger {
2624

2725
void init(void);
2826
int putString(const char * buffer, size_t size);
29-
SemaphoreHandle_t * GetSemaphore();
27+
osMutexId_t * GetMutex();
3028

3129
} // namespace PigweedLogger

examples/platform/silabs/Rpc.cpp

+23-15
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
*/
1818

1919
#include "AppTask.h"
20-
#include "FreeRTOS.h"
2120
#include "PigweedLoggerMutex.h"
2221
#include "pigweed/RpcService.h"
2322
#include "pw_sys_io_efr32/init.h"
24-
#include "task.h"
23+
#include <cmsis_os2.h>
24+
#include <sl_cmsis_os2_common.h>
2525

2626
#if defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE
2727
#include "pigweed/rpc_services/Attributes.h"
@@ -94,7 +94,7 @@ class Efr32Device final : public Device
9494
public:
9595
pw::Status Reboot(const chip_rpc_RebootRequest & request, pw_protobuf_Empty & response) override
9696
{
97-
TickType_t delayMs = kRebootTimerPeriodMs;
97+
uint32_t delayMs = kRebootTimerPeriodMs;
9898
if (request.delay_ms != 0)
9999
{
100100
delayMs = request.delay_ms;
@@ -104,27 +104,36 @@ class Efr32Device final : public Device
104104
ChipLogProgress(NotSpecified, "Did not receive a reboot delay. Defaulting to %d ms",
105105
static_cast<int>(kRebootTimerPeriodMs));
106106
}
107-
mRebootTimer = xTimerCreateStatic("Reboot", pdMS_TO_TICKS(delayMs), false, nullptr, RebootHandler, &mRebootTimerBuffer);
108-
xTimerStart(mRebootTimer, 0);
107+
108+
mRebootTimer = osTimerNew(RebootHandler, osTimerOnce, nullptr, &mRebootTimerAttr);
109+
uint32_t delayTicks = ((uint64_t) osKernelGetTickFreq() * delayMs) / 1000;
110+
osTimerStart(mRebootTimer, delayTicks);
109111
return pw::OkStatus();
110112
}
111113

112114
private:
113115
static constexpr uint32_t kRebootTimerPeriodMs = 1000;
114-
TimerHandle_t mRebootTimer;
115-
StaticTimer_t mRebootTimerBuffer;
116+
osTimerId_t mRebootTimer;
117+
osTimer_t mRebootTimerBuffer;
118+
osTimerAttr_t mRebootTimerAttr = { .name = "Reboot", .cb_mem = &mRebootTimerBuffer, .cb_size = osTimerCbSize };
116119

117-
static void RebootHandler(TimerHandle_t) { NVIC_SystemReset(); }
120+
static void RebootHandler(void * timerCbArg) { NVIC_SystemReset(); }
118121
};
119122
#endif // defined(PW_RPC_DEVICE_SERVICE) && PW_RPC_DEVICE_SERVICE
120123

121124
namespace {
122125

123-
#define RPC_TASK_STACK_SIZE 4096
124-
#define RPC_TASK_PRIORITY 1
125-
static TaskHandle_t sRpcTaskHandle;
126-
StaticTask_t sRpcTaskBuffer;
127-
StackType_t sRpcTaskStack[RPC_TASK_STACK_SIZE];
126+
static osThreadId_t sRpcTaskHandle;
127+
osThread_t sRpcTaskControlBlock;
128+
constexpr uint32_t kRpcTaskSize = 4096;
129+
uint8_t sRpcTaskStack[kRpcTaskSize];
130+
constexpr osThreadAttr_t kRpcTaskAttr = { .name = "RPC",
131+
.attr_bits = osThreadDetached,
132+
.cb_mem = &sRpcTaskControlBlock,
133+
.cb_size = osThreadCbSize,
134+
.stack_mem = sRpcTaskStack,
135+
.stack_size = kRpcTaskSize,
136+
.priority = osPriorityLow };
128137

129138
#if defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE
130139
Attributes attributes_service;
@@ -214,8 +223,7 @@ void Init()
214223
pw_sys_io_Init();
215224

216225
// Start App task.
217-
sRpcTaskHandle = xTaskCreateStatic(RunRpcService, "RPC_TASK", ArraySize(sRpcTaskStack), nullptr, RPC_TASK_PRIORITY,
218-
sRpcTaskStack, &sRpcTaskBuffer);
226+
sRpcTaskHandle = osThreadNew(RunRpcService, nullptr, &kRpcTaskAttr);
219227
}
220228

221229
} // namespace rpc

examples/platform/silabs/efr32/uart.cpp

+34-44
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@
1616
* limitations under the License.
1717
*/
1818
#include "AppConfig.h"
19-
#include "FreeRTOS.h"
20-
#include "event_groups.h"
2119
#include "matter_shell.h"
22-
#include "semphr.h"
23-
#include "task.h"
20+
#include <cmsis_os2.h>
21+
#include <sl_cmsis_os2_common.h>
2422

2523
#ifdef __cplusplus
2624
extern "C" {
@@ -108,28 +106,39 @@ static uint16_t lastCount; // Nb of bytes already processed from the active dmaB
108106
#else
109107
#define UART_MAX_QUEUE_SIZE 25
110108
#endif
111-
#define UART_TASK_SIZE 256
112-
#define UART_TASK_NAME "UART"
113109

114110
#ifdef CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE
115111
#define UART_TX_MAX_BUF_LEN (CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE + 2) // \r\n
116112
#else
117113
#define UART_TX_MAX_BUF_LEN (258)
118114
#endif
119115

120-
static TaskHandle_t sUartTaskHandle;
121-
static StackType_t uartStack[UART_TASK_SIZE * sizeof(StackType_t)];
122-
static StaticTask_t uartTaskStruct;
116+
static constexpr uint32_t kUartTxCompleteFlag = 1;
117+
static osThreadId_t sUartTaskHandle;
118+
constexpr uint32_t kUartTaskSize = 1024;
119+
static uint8_t uartStack[kUartTaskSize];
120+
static osThread_t sUartTaskControlBlock;
121+
constexpr osThreadAttr_t kUartTaskAttr = { .name = "UART",
122+
.attr_bits = osThreadDetached,
123+
.cb_mem = &sUartTaskControlBlock,
124+
.cb_size = osThreadCbSize,
125+
.stack_mem = uartStack,
126+
.stack_size = kUartTaskSize,
127+
.priority = osPriorityRealtime };
123128

124129
typedef struct
125130
{
126131
uint8_t data[UART_TX_MAX_BUF_LEN];
127132
uint16_t length = 0;
128133
} UartTxStruct_t;
129134

135+
static osMessageQueueId_t sUartTxQueue;
136+
static osMessageQueue_t sUartTxQueueStruct;
130137
uint8_t sUartTxQueueBuffer[UART_MAX_QUEUE_SIZE * sizeof(UartTxStruct_t)];
131-
static StaticQueue_t sUartTxQueueStruct;
132-
static QueueHandle_t sUartTxQueue;
138+
constexpr osMessageQueueAttr_t kUartTxQueueAttr = { .cb_mem = &sUartTxQueueStruct,
139+
.cb_size = osMessageQueueCbSize,
140+
.mq_mem = sUartTxQueueBuffer,
141+
.mq_size = sizeof(sUartTxQueueBuffer) };
133142

134143
// Rx buffer for the receive Fifo
135144
static uint8_t sRxFifoBuffer[MAX_BUFFER_SIZE];
@@ -264,8 +273,8 @@ void uartConsoleInit(void)
264273
UARTDRV_Receive(vcom_handle, sRxDmaBuffer, MAX_DMA_BUFFER_SIZE, UART_rx_callback);
265274
UARTDRV_Receive(vcom_handle, sRxDmaBuffer2, MAX_DMA_BUFFER_SIZE, UART_rx_callback);
266275

267-
sUartTxQueue = xQueueCreateStatic(UART_MAX_QUEUE_SIZE, sizeof(UartTxStruct_t), sUartTxQueueBuffer, &sUartTxQueueStruct);
268-
sUartTaskHandle = xTaskCreateStatic(uartMainLoop, UART_TASK_NAME, UART_TASK_SIZE, nullptr, 30, uartStack, &uartTaskStruct);
276+
sUartTxQueue = osMessageQueueNew(UART_MAX_QUEUE_SIZE, sizeof(UartTxStruct_t), &kUartTxQueueAttr);
277+
sUartTaskHandle = osThreadNew(uartMainLoop, nullptr, &kUartTaskAttr);
269278

270279
assert(sUartTaskHandle);
271280
assert(sUartTxQueue);
@@ -311,9 +320,8 @@ void USART_IRQHandler(void)
311320
*/
312321
void UART_tx_callback(struct UARTDRV_HandleData * handle, Ecode_t transferStatus, uint8_t * data, UARTDRV_Count_t transferCount)
313322
{
314-
BaseType_t xHigherPriorityTaskWoken;
315-
316-
vTaskNotifyGiveFromISR(sUartTaskHandle, &xHigherPriorityTaskWoken) portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
323+
// This function may be called from Interrupt Service Routines.
324+
osThreadFlagsSet(sUartTaskHandle, kUartTxCompleteFlag);
317325
}
318326

319327
/*
@@ -363,20 +371,10 @@ int16_t uartConsoleWrite(const char * Buf, uint16_t BufLength)
363371
memcpy(workBuffer.data, Buf, BufLength);
364372
workBuffer.length = BufLength;
365373

366-
if (xPortIsInsideInterrupt())
374+
if (osMessageQueuePut(sUartTxQueue, &workBuffer, osPriorityNormal, 0) == osOK)
367375
{
368-
BaseType_t xHigherPriorityTaskWoken;
369-
xQueueSendFromISR(sUartTxQueue, &workBuffer, &xHigherPriorityTaskWoken);
370-
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
371376
return BufLength;
372377
}
373-
else
374-
{
375-
if (pdTRUE == xQueueSend(sUartTxQueue, &workBuffer, portMAX_DELAY))
376-
{
377-
return BufLength;
378-
}
379-
}
380378

381379
return UART_CONSOLE_ERR;
382380
}
@@ -400,20 +398,10 @@ int16_t uartLogWrite(const char * log, uint16_t length)
400398
memcpy(workBuffer.data + length, "\r\n", 2);
401399
workBuffer.length = length + 2;
402400

403-
if (xPortIsInsideInterrupt())
401+
if (osMessageQueuePut(sUartTxQueue, &workBuffer, osPriorityNormal, 0) == osOK)
404402
{
405-
BaseType_t xHigherPriorityTaskWoken;
406-
xQueueSendFromISR(sUartTxQueue, &workBuffer, &xHigherPriorityTaskWoken);
407-
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
408403
return length;
409404
}
410-
else
411-
{
412-
if (pdTRUE == xQueueSend(sUartTxQueue, &workBuffer, 0))
413-
{
414-
return length;
415-
}
416-
}
417405

418406
return UART_CONSOLE_ERR;
419407
}
@@ -453,11 +441,11 @@ void uartMainLoop(void * args)
453441
while (1)
454442
{
455443

456-
BaseType_t eventReceived = xQueueReceive(sUartTxQueue, &workBuffer, portMAX_DELAY);
444+
osStatus_t eventReceived = osMessageQueueGet(sUartTxQueue, &workBuffer, nullptr, osWaitForever);
457445
while (eventReceived == pdTRUE)
458446
{
459447
uartSendBytes(workBuffer.data, workBuffer.length);
460-
eventReceived = xQueueReceive(sUartTxQueue, &workBuffer, 0);
448+
eventReceived = osMessageQueueGet(sUartTxQueue, &workBuffer, nullptr, 0);
461449
}
462450
}
463451
}
@@ -470,29 +458,31 @@ void uartMainLoop(void * args)
470458
*/
471459
void uartSendBytes(uint8_t * buffer, uint16_t nbOfBytes)
472460
{
473-
474461
#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
475462
sl_power_manager_add_em_requirement(SL_POWER_MANAGER_EM1);
476-
#endif
463+
#endif // SL_CATALOG_POWER_MANAGER_PRESENT
464+
477465
#if SL_UARTCTRL_MUX
478466
sl_wfx_host_pre_uart_transfer();
479467
#endif // SL_UARTCTRL_MUX
468+
480469
#if (defined(EFR32MG24) && defined(WF200_WIFI))
481470
// Blocking transmit for the MG24 + WF200 since UART TX is multiplexed with
482471
// WF200 SPI IRQ
483472
UARTDRV_ForceTransmit(vcom_handle, (uint8_t *) buffer, nbOfBytes);
484473
#else
485474
// Non Blocking Transmit
486475
UARTDRV_Transmit(vcom_handle, (uint8_t *) buffer, nbOfBytes, UART_tx_callback);
487-
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
476+
osThreadFlagsWait(kUartTxCompleteFlag, osFlagsWaitAny, osWaitForever);
488477
#endif /* EFR32MG24 && WF200_WIFI */
478+
489479
#if SL_UARTCTRL_MUX
490480
sl_wfx_host_post_uart_transfer();
491481
#endif // SL_UARTCTRL_MUX
492482

493483
#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
494484
sl_power_manager_remove_em_requirement(SL_POWER_MANAGER_EM1);
495-
#endif
485+
#endif // SL_CATALOG_POWER_MANAGER_PRESENT
496486
}
497487

498488
#ifdef __cplusplus

0 commit comments

Comments
 (0)