This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Precise error resulting to hardfault

Hey All,

Insight:
I have a RTOS code written on LPC1788. The code has one task to receive data from the uart. Depending upon the data received from the uart, a reply is sent back. To send the reply from a buffer, a pointer to buffer is passed via mail box.

Problem:
Things were good, but now i have started getting a PRECISERR. The Buffer fault address is 0xE8BA0ED (which is not a valid memory location).
From the stack data, (read when a hardfault is generated), PC points to 0x0001BE1C.

The following is the piece of code that i found at the memory location, but dont know what the code (looks like a library function code)

rt_get_first:

0x0001BE18 4601      MOV      r1,r0
0x0001BE1A 6840      LDR      r0,[r0,#0x04]
0x0001BE1C 6842      LDR      r2,[r0,#0x04]
0x0001BE1E 604A      STR      r2,[r1,#0x04]
0x0001BE20 780B      LDRB     r3,[r1,#0x00]
0x0001BE22 2200      MOVS     r2,#0x00
0x0001BE24 2B02      CMP      r3,#0x02
0x0001BE26 D005      BEQ      0x0001BE34
0x0001BE28 2B01      CMP      r3,#0x01
0x0001BE2A D003      BEQ      0x0001BE34
0x0001BE2C 2B03      CMP      r3,#0x03
0x0001BE2E D001      BEQ      0x0001BE34
0x0001BE30 6042      STR      r2,[r0,#0x04]
0x0001BE32 4770      BX       lr
0x0001BE34 6843      LDR      r3,[r0,#0x04]
0x0001BE36 B10B      CBZ      r3,0x0001BE3C
0x0001BE38 6099      STR      r1,[r3,#0x08]
0x0001BE3A 6042      STR      r2,[r0,#0x04]
0x0001BE3C 6082      STR      r2,[r0,#0x08]
0x0001BE3E 4770      BX       lr

Can anyone tell me what the above code is all about?
what is actual cause of the hardfault?
What steps to take, to solve the issue?

Parents
  •  p_task = rt_get_first (&os_rdy);
    os_tsk.run->ret_val = OS_R_OK;
    

    Going to assume based on how it's called that os_rdy is at a fixed address, and pointer within it is invalid.

    I'd probably look for heap corruption, buffers being overrun in your service routine, and to a lesser extent the stack.

    P_TCB rt_get_first (P_XCB p_CB);
    
     typedef struct OS_XCB {
      U8 cb_type; /* Control Block Type */
      struct OS_TCB *p_lnk; /* Link pointer for ready/sem. wait list */
      struct OS_TCB *p_rlnk; /* Link pointer for sem./mbx lst backwards */
      struct OS_TCB *p_dlnk; /* Link pointer for delay list */
      struct OS_TCB *p_blnk; /* Link pointer for delay list backwards */
      U16 delta_time; /* Time until time out */
    } *P_XCB;
    
     typedef struct OS_TCB {
      /* General part: identical for all implementations. */
      U8 cb_type; /* Control Block Type */
      U8 state; /* Task state */
      U8 prio; /* Execution priority */
      U8 task_id; /* Task ID value for optimized TCB access */
      struct OS_TCB *p_lnk; /* Link pointer for ready/sem. wait list */
      struct OS_TCB *p_rlnk; /* Link pointer for sem./mbx lst backwards */
      struct OS_TCB *p_dlnk; /* Link pointer for delay list */
      struct OS_TCB *p_blnk; /* Link pointer for delay list backwards */
      U16 delta_time; /* Time until time out */
      U16 interval_time; /* Time interval for periodic waits */
      U16 events; /* Event flags */
      U16 waits; /* Wait flags */
      void **msg; /* Direct message passing when task waits */
      U8 ret_val; /* Return value upon completion of a wait */
    
      /* Hardware dependant part: specific for CM processor */
      U8 ret_upd; /* Updated return value */
      U16 priv_stack; /* Private stack size, 0= system assigned */
      U32 tsk_stack; /* Current task Stack pointer (R13) */
      U32 *stack; /* Pointer to Task Stack memory block */
    
      /* Task entry point used for uVision debugger */
      FUNCP ptask; /* Task entry address */
    } *P_TCB;
    

    p_lnk, chaining thereof ?

Reply
  •  p_task = rt_get_first (&os_rdy);
    os_tsk.run->ret_val = OS_R_OK;
    

    Going to assume based on how it's called that os_rdy is at a fixed address, and pointer within it is invalid.

    I'd probably look for heap corruption, buffers being overrun in your service routine, and to a lesser extent the stack.

    P_TCB rt_get_first (P_XCB p_CB);
    
     typedef struct OS_XCB {
      U8 cb_type; /* Control Block Type */
      struct OS_TCB *p_lnk; /* Link pointer for ready/sem. wait list */
      struct OS_TCB *p_rlnk; /* Link pointer for sem./mbx lst backwards */
      struct OS_TCB *p_dlnk; /* Link pointer for delay list */
      struct OS_TCB *p_blnk; /* Link pointer for delay list backwards */
      U16 delta_time; /* Time until time out */
    } *P_XCB;
    
     typedef struct OS_TCB {
      /* General part: identical for all implementations. */
      U8 cb_type; /* Control Block Type */
      U8 state; /* Task state */
      U8 prio; /* Execution priority */
      U8 task_id; /* Task ID value for optimized TCB access */
      struct OS_TCB *p_lnk; /* Link pointer for ready/sem. wait list */
      struct OS_TCB *p_rlnk; /* Link pointer for sem./mbx lst backwards */
      struct OS_TCB *p_dlnk; /* Link pointer for delay list */
      struct OS_TCB *p_blnk; /* Link pointer for delay list backwards */
      U16 delta_time; /* Time until time out */
      U16 interval_time; /* Time interval for periodic waits */
      U16 events; /* Event flags */
      U16 waits; /* Wait flags */
      void **msg; /* Direct message passing when task waits */
      U8 ret_val; /* Return value upon completion of a wait */
    
      /* Hardware dependant part: specific for CM processor */
      U8 ret_upd; /* Updated return value */
      U16 priv_stack; /* Private stack size, 0= system assigned */
      U32 tsk_stack; /* Current task Stack pointer (R13) */
      U32 *stack; /* Pointer to Task Stack memory block */
    
      /* Task entry point used for uVision debugger */
      FUNCP ptask; /* Task entry address */
    } *P_TCB;
    

    p_lnk, chaining thereof ?

Children