Ошибка времени выполнения в реализации bR561 COREB FreeRTOS при указании на данные структуры - PullRequest
0 голосов
/ 07 февраля 2012

У меня ошибка во время выполнения в нескольких функциях, когда она пытается получить доступ к структурным данным, обычно передаваемым в качестве параметра функции.

первый случай проблемы:

signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, void * const p\

vBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking )

{

..............



if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TY\

PE ) 0 )



.......................



}

где pxQueue - это структура:

typedef xQUEUE * xQueueHandle;

с:

typedef struct QueueDefinition

{

        signed char *pcHead;                            /*< Points to the begin\

ning of the queue storage area. */

    signed char *pcTail;                            /*< Points to the byte \

at the end of the queue storage area.  Once more byte is allocated than necessa\

ry to store the queue items, this is used as a marker. */



        signed char *pcWriteTo;                         /*< Points to the free \

next place in the storage area. */

        signed char *pcReadFrom;  
                    /*< Points to the last \

place that a queued item was read from. */


        xList xTasksWaitingToSend;                              /*< List of tas\

ks that are blocked waiting to post onto this queue.  Stored in priority order.\

*/
        xList xTasksWaitingToReceive;                   /*< List of tasks that \

are blocked waiting to read from this queue.  Stored in priority order. */


        volatile unsigned portBASE_TYPE uxMessagesWaiting;/*< The number of ite\

ms currently in the queue. */
        unsigned portBASE_TYPE uxLength;                /*< The length of the q\

ueue defined as the number of items it will hold, not the number of bytes. */
        unsigned portBASE_TYPE uxItemSize;              /*< The size of each it\

ems that the queue will hold. */


        signed portBASE_TYPE xRxLock;                   /*< Stores the number o\

f items received from the queue (removed from the queue) while the queue was lo\

cked.  Set to queueUNLOCKED when the queue is not locked. */
        signed portBASE_TYPE xTxLock;                   /*< Stores the number o\

f items transmitted to the queue (added to the queue)

while the queue was locke\

d.  Set to qu.......................



}

где pxQueue - это структура:

typedef xQUEUE * xQueueHandle;

с:

typedef struct QueueDefinition

{

        signed char *pcHead;                            /*< Points to the begin\

ning of the queue storage area. */

    signed char *pcTail;                            /*< Points to the byte \

at the end of the queue storage area.  Once more byte is allocated than necessa\

ry to store the queue items, this is used as a marker. */



        signed char *pcWriteTo;                         /*< Points to the free \

next place in the storage area. */

        signed char *pcReadFrom;  
                    /*< Points to the last \

place that a queued item was read from. */


        xList xTasksWaitingToSend;                              /*< List of tas\

ks that are blocked waiting to post onto this queue.  Stored in priority order.\

*/
        xList xTasksWaitingToReceive;                   /*< List of tasks that \

are blocked waiting to read from this queue.  Stored in priority order. */


        volatile unsigned portBASE_TYPE uxMessagesWaiting;/*< The number of ite\

ms currently in the queue. */
        unsigned portBASE_TYPE uxLength;                /*< The length of the q\

ueue defined as the number of items it will hold, not the number of bytes. */
        unsigned portBASE_TYPE uxItemSize;              /*< The size of each it\

ems that the queue will hold. */


        signed portBASE_TYPE xRxLock;                   /*< Stores the number o\

f items received from the queue (removed from the queue) while the queue was lo\

cked.  Set to queueUNLOCKED when the queue is not locked. */
        signed portBASE_TYPE xTxLock;                   /*< Stores the number o\

f items transmitted to the queue (added to the queue)

while the queue was locke\

d.  Set to queueUNLOCKED when the queue is not locked. */



} xQUEUE;
eueUNLOCKED when the queue is not locked. */



} xQUEUE;

ошибка времени выполнения:

.....
COREB: start xQueueGenericReceive                                           
COREB: execption 24 addr 3c00384                                            
COREB: coreb dump stack                                                     
COREB: found fp: ff700900                                                   
COREB:  call frame 0 -12 feb055e2                                           
COREB:  call frame 0 -11 00000000                                           
COREB:  call frame 0 -9 00000000                                            
COREB:  call frame 0 -8 ff7008d0    

......

Аналогично, у меня та же проблема со следующей функцией:

void vListRemove( xListItem *pxItemToRemove )

{

xList * pxList;



   pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;

        pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;

}

где pxItemToRemove-> pxPrevious можно прочитать, но не pxItemToRemove-> pxNext-> pxPrevious

это структура:

struct xLIST_ITEM

{

     portTickType xItemValue;                                /*< The value b\

eing listed.  In most cases this is used to sort the list in descending order. \

*/

        volatile struct xLIST_ITEM * pxNext;    /*< Pointer to the next xListIt\

em in the list. */

        volatile struct xLIST_ITEM * pxPrevious;/*< Pointer to the previous xLi\

stItem in the list. */

        void * pvOwner;                                                 /*< Poi\

nter to the object (normally a TCB) that contains the list item.  There is ther\

efore a two way link between the object containing the list item and the list i\

tem itself. */

        void * pvContainer;                                             /*< Poi\

nter to the list in which this list item is placed (if any). */

};

typedef struct xLIST_ITEM xListItem;            /* For some reason lint wants t\

his as two separate definitions. */

ошибка времени выполнения:

COREB: got to vTaskDelete                                                   
COREB: pxTCB GLI prev: a5a5a5a5                                             
COREB: sent to list: 3d02004                                                
COREB: list_rem px prev: a5a5a5a5                                           
COREB: execption 24 addr 3c05444                                            
COREB: coreb dump stack                                                     
COREB: found fp: ff7008fc                                                   
COREB:  call frame 0 -12 feb055e2                                           
COREB:  call frame 0 -11 00000000                                           
COREB:  call frame 0 -9 00000000                                            
COREB:  call frame 0 -8 ff7008cc                                            
COREB:  call frame 0 -7 ff700ff4    

Заранее спасибо.

William


Дальнейшая отладка с помощью gdb У меня есть pxQueue:

p/x *pxQueue

$9 = {pcHead = 0xadadadad, pcTail = 0xadadadad, pcWriteTo = 0xadadadad,

  pcReadFrom = 0xadadadad, xTasksWaitingToSend = {

    uxNumberOfItems = 0xadadadad, pxIndex = 0xadadadad, xListEnd = {

      xItemValue = 0xadad, pxNext = 0xadadadad, pxPrevious = 0xadadadad}},

  xTasksWaitingToReceive = {uxNumberOfItems = 0xadadadad,

    pxIndex = 0xadadadad, xListEnd = {xItemValue = 0xadad,

      pxNext = 0xadadadad, pxPrevious = 0xadadadad}},

  uxMessagesWaiting = 0xadadadad, uxLength = 0xadadadad,

  uxItemSize = 0xadadadad, xRxLock = 0xadadadad, xTxLock = 0xadadadad}

это действительно странно, все параметры структуры имеют одинаковое значение: 0xadadadad

когда я продолжаю отладку и смотрю на создание семафора как на объект очереди в функции создания очереди, я получаю нормальные значения:

 p *pxNewQueue

$7 = {pcHead = 0x3d17000 "", pcTail = 0x3d17000 "", pcWriteTo = 0x3d17000 "", 

  pcReadFrom = 0x3d17000 "", xTasksWaitingToSend = {uxNumberOfItems = 0, 

    pxIndex = 0x3d16018, xListEnd = {xItemValue = 65535, pxNext = 0x3d16018, 

      pxPrevious = 0x3d16018}}, xTasksWaitingToReceive = {uxNumberOfItems = 0, 

    pxIndex = 0x3d1602c, xListEnd = {xItemValue = 65535, pxNext = 0x3d1602c, 

      pxPrevious = 0x3d1602c}}, uxMessagesWaiting = 0, uxLength = 1, 

  uxItemSize = 0, xRxLock = -1, xTxLock = -1}

Спасибо

William

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

Я нашел ответ,

По сути, поскольку во FreeRTOS их не было, я использовал gdb и искал pvParameter при создании задачи и смотрел, где она была сохранена в стеке.затем, когда я запускаю задачу с помощью функции taskhook, я возвращаю параметр:

void *param = *(pxCurrentTCB->pxTopOfStack+31);

                //        xTaskCallApplicationTaskHook( pxCurrentTCB, pxCurrent\
TCB->pxTopOfStack);                                                             
                xTaskCallApplicationTaskHook( pxCurrentTCB,param );

, затем, когда вызываются очередь и lis для semafor, он указывает на правильный адрес.и структура данных извлекается.

0 голосов
/ 07 февраля 2012

Что вы пытаетесь сделать и как.Что такое COREB?

Функции, из которых вы разместили фрагменты кода, не изменены из официального кода FreeRTOS?Код обычно компилируется и связывается в исполняемый файл, поэтому вы не получите никакой такой ошибки во время выполнения.Если бы была какая-то проблема, вы бы получили только ошибки компиляции / ссылки.Если вы получаете ошибки во время выполнения, то пытаетесь ли вы интерпретировать код, а не компилировать его?

...