Функция osMessageGet CMSIS-RTOS
Я работал над программным обеспечением, основанным на CMSIS-RTOS, и у меня проблема с функцией osMessageGet. Мое программное обеспечение состоит из четырех задач RTOS, и две из них обмениваются данными через osMessageQueue вместе с osPool. Одна задача (Task_100ms) является производителем, а вторая задача (Task_200ms) является потребителем.
Task_100ms получает данные от шины CAN и создает структуры, содержащие полученные данные. Производитель распределяет память по пулу (flash_pool) с помощью функции osPoolAlloc и получает указатель на выделенную память. Producer копирует содержимое структуры обмена в блок памяти в пуле, используя этот указатель, и помещает копию этого указателя в очередь (flash_queue) с помощью функции osMessagePut (см. Код функции put_program_chunk ниже).
Task_200ms пытается извлечь указатели из flash_queue с помощью функции osMessageGet (см. Код функции program_chunk ниже). Пока очередь пуста, потребитель ждет и все в порядке. Затем первый указатель помещается на flash_queue с помощью Task_100ms. Task_200ms вызывает функцию osMessageGet, и это приводит к сбросу uC, если для osMessageGet установлено значение osWaitForever. Если тайм-аут для osMessageGet установлен в 0, программный сброс не вызывается. Но в обоих случаях (время ожидания равно 0 или osWaitForever), когда я перебираю код в Eclipse, я не могу выполнить сразу следующий оператор после вызова функции osMessageGet.
Кто-нибудь может дать мне какой-нибудь совет, где может быть причина моих проблем? Я могу отправить вам весь исходный код, если это необходимо. Спасибо заранее за любые предложения.
BOOL put_program_chunk(main_controller_req_t req){
main_controller_req_t *p_req;
BOOL retval;
BOOL no_memory = FALSE;
/*!!!*/
osStatus status;
uint8_t tmp;
// allocate memory in pool
p_req = (main_controller_req_t *)osPoolAlloc(flash_pool);
if(p_blk == NULL){
printf("No more space in flash pool.\r\n");
}
if(p_req != NULL){
*p_req = req;
// insert the prepared request into the transmission queue
// put the message into the queue
// wait 5 ms?
status = osMessagePut(flash_queue, (uint32_t)(p_req), 5);
/*!!!*/
if(status == osOK){
tmp = 1;
}else{
tmp = 0;
}
}else{
no_memory = TRUE;
}
if(no_memory){
retval = FALSE;
}else{
retval = TRUE;
}
return retval;
}
void program_chunk(void){
osEvent event;
osStatus status;
main_controller_req_t *p_req;
main_controller_req_t req;
pdt_result_t result;
// !!!
uint8_t tmp;
// retrieve the data block from the message queue
event = osMessageGet(flash_queue, 0);
// !!!
tmp++;
/*
if(event.status == osEventMessage){
p_req = ((main_controller_req_t *)(event.value.p));
// copy the content of memory block in receiving pool
req = *p_req;
// free the memory in pool
status = osPoolFree(flash_pool, p_req);
// Normal (=000000) or Boot (=BOOTBL) mode?
if(*req.mode == 0 && *(req.mode + 1) == 0 && *(req.mode + 2) == 0 &&
*(req.mode + 3) == 0 && *(req.mode + 4) == 0 && *(req.mode + 5) == 0){
// Normal mode
// program chunk for the Slot_0 or Slot_1?
if(((req.flash_page_number >= 0x01) && (req.flash_page_number < MAX_AC_PAGE)) ||
((req.flash_page_number == MAX_AC_PAGE) && (req.flash_block_number <= MAX_AC_BLOCK))){
#ifdef APP_DEBUG
printf("AC programming!\r\n");
#endif
// yes - program the retrieved program chunk
result = pdt_app_program_chunk(req.data_block, 32);
// according to the result send the short flash write response message - page and block OK
send_short_flash_load_write_resp((result == PDT_RESULT_OK) ? TRUE : FALSE, FALSE, req.flash_page_number, req.flash_block_number);
// if unsuccessful programming
if(result != PDT_RESULT_OK){
// go into WAIT_TO_FLASH_LOAD_COMPLETE
SetLogicSignal(LGoWtFlshLdCmpl);
}
// program chunk for Motor Controller?
}else if(((req.flash_page_number == MAX_AC_PAGE) && (req.flash_block_number > MAX_AC_BLOCK && req.flash_block_number <= MAX_MC_BLOCK)) ||
((req.flash_page_number > MAX_AC_PAGE) && (req.flash_page_number <= MAX_MC_PAGE))){
#ifdef APP_DEBUG
printf("MC programming!\r\n");
#endif
// yes - program the retrieved program chunk
result = pdt_mc_update_internal_motor_controller_chunk(req.data_block, 32);
// according to the result send the short flash write response message - page and block OK
send_short_flash_load_write_resp((result == PDT_RESULT_OK) ? TRUE : FALSE, FALSE, req.flash_page_number, req.flash_block_number);
// end of the binary?
if((req.flash_page_number == NO_PAGES) && (req.flash_block_number == BLOCKS_IN_PAGE) && result == PDT_RESULT_OK){
result = pdt_mc_update_motor_controller();
// invoke SW reset
result = pdt_app_switch_application();
// if unsuccessful programming
}else if(result != PDT_RESULT_OK){
// go into WAIT_TO_FLASH_LOAD_COMPLETE
SetLogicSignal(LGoWtFlshLdCmpl);
}
// wrong destination address?
}else{
#ifdef APP_DEBUG
printf("Wrong destination address!\r\n");
#endif
// wrong data block destination
send_short_flash_load_write_resp(FALSE, TRUE, req.flash_page_number, req.flash_block_number);
// go into WAIT_TO_FLASH_LOAD_COMPLETE
SetLogicSignal(LGoWtFlshLdCmpl);
}
}
}
*/
}