I'm using nRF52840 with nRF5_SDK_17.1.0_ddde560, and using the ble_app_multirole_lesc example file.
When I port FreeRTOS to the multi_role, there are no errors during compilation, and the counter runs after starting the debug session.
However, the RTT viewer shows <error> app: SOFTDEVICE: INVALID MEMORY ACCESS,
and the phone cannot connect to it.
Below is a portion of my code and files:
main.c
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "queue.h"
#include "portmacro.h"
#include "event_groups.h"
#define COUNTER 1
typedef struct
{
uint8_t event; // event type
void *pData; // event data pointer
}mrEvt_t;
int counter = 0;
QueueHandle_t appQueue;
TaskHandle_t AppTask_handle;
TimerHandle_t xTimer_COUNTER;
void vAppTask(void *pvParameter);
static BaseType_t multirole_enqueueMsg(uint8_t event, uint8_t state, uint8_t *pData)
{
BaseType_t success;
mrEvt_t *pMsg = pvPortMalloc(sizeof(mrEvt_t));
if (pMsg)
{
pMsg->event = event;
pMsg->pData = pData;
success = xQueueSend(appQueue, &pMsg, portMAX_DELAY);
return (success == pdPASS) ? pdPASS : pdFAIL;
}
return pdFAIL;
}
void vTimerCallback_COUNTER(void *pvParameters)
{
multirole_enqueueMsg(COUNTER, 0, NULL);
}
void initTimer(void)
{
xTimer_COUNTER = xTimerCreate("BLE_COUNTER", 100, pdTRUE, NULL, vTimerCallback_COUNTER);
}
void initQueue(void)
{
appQueue = xQueueCreate(10, sizeof(mrEvt_t*));
}
void multirole_processAppMsg(void)
{
mrEvt_t *pMsg;
bool safeToDealloc = true;
BaseType_t queue_receive = xQueueReceive(appQueue, &pMsg, portMAX_DELAY);
if(queue_receive == pdPASS)
{
switch(pMsg->event)
{
case COUNTER:
counter++;
break;
}
if ((safeToDealloc == true) && (pMsg->pData != NULL))
{
vPortFree(pMsg->pData);
safeToDealloc = false;
}
}
}
int main(void)
{
bool erase_bonds;
// Initialize.
initTimer();
initQueue();
// Start execution.
NRF_LOG_INFO("LE Secure Connections example started.");
if (erase_bonds == true)
{
delete_bonds();
// Scanning and advertising is started by PM_EVT_PEERS_DELETE_SUCEEDED.
}
else
{
adv_scan_start();
}
xTaskCreate(vAppTask, "AppTask", configMINIMAL_STACK_SIZE /*60*/, NULL, tskIDLE_PRIORITY + 1 /*0+1*/, &AppTask_handle);
vTaskStartScheduler();
// Enter main loop.
for (;;)
{
idle_state_handle();
APP_ERROR_HANDLER(NRF_ERROR_FORBIDDEN);
}
}
void vAppTask(void *pvParameters)
{
xTimerStart(xTimer_COUNTER, 0);
for (;;)
{
multirole_processAppMsg();
}
}
sdk_config.h
#define NRFX_CLOCK_ENABLED 1 #define NRFX_CLOCK_CONFIG_LF_SRC 1 #define NRFX_CLOCK_CONFIG_IRQ_PRIORITY 6 #define NRFX_CLOCK_CONFIG_LOG_ENABLED 0 #define NRFX_CLOCK_CONFIG_LOG_LEVEL 3 #define NRFX_CLOCK_CONFIG_INFO_COLOR 0 #define NRFX_CLOCK_CONFIG_DEBUG_COLOR 0 #define NRF_CLOCK_ENABLED 1 #define CLOCK_CONFIG_LF_SRC 1 #define CLOCK_CONFIG_LF_CAL_ENABLED 0 #define CLOCK_CONFIG_IRQ_PRIORITY 6

