Функция 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);
            }

        }
    }
    */
}

0 ответов

Другие вопросы по тегам