halt in the loop in vListInsert function

zhuchunxia wrote on Thursday, June 02, 2016:

I were working on porting FreeRTOSv8.2.3 to our CK610 cpu core… the
first task can work now . but it can’t switch task.
I trace it and find it halt in the loop in vListInsert function.

According to those comment , I check my code and exclude some case
case 1. stack overflow does not happen by enable vApplicationStackOverflowHook trace function
case 3. my code is simple enough and does not use queue ore semaphore
case 4. my code is simple enough and does not use queue ore semaphore

But for case 2, I am not sure my design is okay or not . I doesn’t set interrupt priority for my interrupt because of the interrupt controller is simple and work with MASK and CLEAR register …so I disable/enable global interrupt by CPU_SR_Save() and CPU_SR_Restore() functions…
CPU_SR_Save is to save PSR register first then clear IE bit to disable interrupt
CPU_SR_Restore is write old PSR value into PSR
my application is simple, it is just to create a task which printf a string with interview 100ms.
in whole system, there might be two interrupt source, they are one timer and system trap used to switch context.

the CPU core interrupt controller is a bit of different, CPU will clear IE in PSR automatically when interrupt happen. and set IE when interrtup return …

my view seems to be good… but it really halt in the loop …Could you help to explain ?

#define portDISABLE_INTERRUPTS() ulPortSetIPL( 1 )
#define portENABLE_INTERRUPTS() ulPortSetIPL( 0 )
portLONG ulPortSetIPL( portLONG x)
{
static portLONG cpu_sr = 0x80000100;

if (x)
{
cpu_sr = CPU_SR_Save();
}
else
{
CPU_SR_Restore(cpu_sr);
}

return cpu_sr;
}

void vListInsert( List_t * const pxList, ListItem_t * const
pxNewListItem ) { ListItem_t *pxIterator; const TickType_t
xValueOfInsertion = pxNewListItem->xItemValue;

/* Only effective when configASSERT() is also defined, these tests
may catch
the list data structures being overwritten in memory. They will not
catch
data errors caused by incorrect configuration or use of FreeRTOS. */
listTEST_LIST_INTEGRITY( pxList );
listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );

/* Insert the new list item into the list, sorted in xItemValue
order.

If the list already contains a list item with the same item value
then the
new list item should be placed after it. This ensures that TCB’s
which are
stored in ready lists (all of which have the same xItemValue value)
get a
share of the CPU. However, if the xItemValue is the same as the back
marker
the iteration loop below will not end. Therefore the value is
checked
first, and the algorithm slightly modified if necessary. /
if( xValueOfInsertion == portMAX_DELAY )
{
pxIterator = pxList->xListEnd.pxPrevious;
}
else
{
/
*** NOTE


  If you find your application is crashing here then likely causes are
  listed below.  In addition see

FreeRTOS - Open Source RTOS Kernel for small embedded systems for
more tips, and ensure configASSERT() is defined!
FreeRTOS - The Free RTOS configuration constants and configuration options - FREE Open Source RTOS for small real time embedded systems

  	1) Stack overflow -
  	   see

FreeRTOS - stacks and stack overflow checking
2) Incorrect interrupt priority assignment, especially on Cortex-M
parts where numerically high priority values denote low actual
interrupt priorities, which can seem counter intuitive. See
RTOS for ARM Cortex-M
and the definition
of configMAX_SYSCALL_INTERRUPT_PRIORITY on
FreeRTOS - The Free RTOS configuration constants and configuration options - FREE Open Source RTOS for small real time embedded systems
3) Calling an API function from within a critical section or when
the scheduler is suspended, or calling an API function that does
not end in “FromISR” from an interrupt.
4) Using a queue or semaphore before it has been initialised or
before the scheduler has been started (are interrupts firing
before vTaskStartScheduler() has been called?).

**********************************************************************/
printk(“list insert : try insert55555 \r\n”);

  for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd );

pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator =
pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is
pxIterator->used as
the list end to save RAM. This is checked and valid. /
{
/
There is nothing to do here, just iterating to the wanted
insertion position. */
}
printk(“list insert : try insert 888888\r\n”);
}

pxNewListItem->pxNext = pxIterator->pxNext;
pxNewListItem->pxNext->pxPrevious = pxNewListItem;
pxNewListItem->pxPrevious = pxIterator;
pxIterator->pxNext = pxNewListItem;

/* Remember which list the item is in. This allows fast removal of
the
item later. */
pxNewListItem->pvContainer = ( void * ) pxList;

( pxList->uxNumberOfItems )++;
}

rtel wrote on Monday, June 06, 2016:

For some reason this got stuck in moderation - but I think has since been answere in another thread.