blackfin bf561 Сбой реализации FreeRTOS во время выполнения при загрузке задачи - PullRequest
5 голосов
/ 18 декабря 2011

Я реализовал в Blackfin BF561 coreB FreeRTOS из кода:

http://www.freertos.org/index.html?http://interactive.freertos.org/forums/79366-analog-devices

Я преобразовал в голый металл как эльфийский исполняемый файл, используя gcc.

Я близко, но у меня ошибка во время выполнения, которую я не могу понять. Когда планировщик запускается и пытается запустить первую задачу, указатель памяти теряется, и он не запускает первый стек, вместо этого он запускает функцию внутри первой задачи и теряется при выходе из функции.

это соответствующий журнал отладки:

COREB: end setup LED                                                            
COREB: handler declared                                                         
COREB: Initialise New TCB:NewTCB address: 3d01000                               
COREB: TopofStask: 0, pxTopOfStack = 3d0263c                                    
COREB: pxTaskCode =3c033a0, pvParameters = 0                                    
COREB: returned pxNewTCB->pxTopOfStack = 3d02588                                
COREB: task created:                                                            
COREB: top of stack: 3d02588                                                    
COREB: GenericListItem: 0                                                       
COREB: Event ListItem: 9                                                        
COREB: Priority: 1                                                              
COREB: start of stack: 3d02000                                                  
COREB: Task Name: BootTas                                                       
COREB: TCB number: 0                                                            
COREB: Task Tag: 0                                                              
COREB: Add the idle task at the lowest priority                                 
COREB: Initialise New TCB:NewTCB address: 3d03000                               
COREB: TopofStask: 0, pxTopOfStack = 3d0431c                                    
COREB: pxTaskCode =3c0295c, pvParameters = 0                                    
COREB: returned pxNewTCB->pxTopOfStack = 3d04268                                
COREB: task created:                                                            
COREB: top of stack: 3d04268                                                    
COREB: GenericListItem: 0                                                       
COREB: Event ListItem: a                                                        
COREB: Priority: 0                                                              
COREB: start of stack: 3d04000                                                  
COREB: Task Name: IDLE                                                          
COREB: TCB number: 1                                                            
COREB: Task Tag: 0                                                              
COREB: end Add the idle task at the lowest priority                             
COREB: if xReturn == 1, and xReturn = 1                                         
COREB: before disable interupt                                                  
COREB: after disable interupt                                                   
COREB: before  xPortStartScheduler                                              
COREB: start xPortStartScheduler fn before set core timer                       
COREB: after ContextSwitch interupt flag                                        
COREB: before prvSetupTimerInterrupt                                            
COREB: after prvSetupTimerInterupt                                              
COREB: Task Switch context called                                               
COREB: The scheduler is running                                                 
COREB: trace switched out TCB:ff700bf8                                          
COREB: name of switch out task:efore  xPortStartScheduler                       

COREB: before Task first check for stack overflow                               
COREB: Task first check for stack overflow called                               
COREB: Task second check for stack overflow called                              
COREB: before call get owner of next entry                                      
COREB: get owner of next entry:                                                 
COREB: current TCB 3d01000                                                      
COREB: pxReadyTasksLists[ uxTopReadyPriority ] = 1                              
COREB: TCB content:                                                             
COREB: top of stack: 3d02588                                                    
COREB: GenericListItem: 0                                                       
COREB: Event ListItem: 9                                                        
COREB: Priority: 1                                                              
COREB: start of stack: 3d02000                                                  
COREB: Task Name: BootTas                                                       
COREB: TCB number: 0                                                            
COREB: Task Tag: 0                                                              
COREB: trace switched in:BootTas                                                
COREB: write trace to buffer                                                    
COREB: task increment tick: 1                                                   
COREB: end of app init                                                          
COREB: execption 2b addr ff700be4                                               
COREB: coreb dump stack                                                         
COREB: found fp: ff700b64  

и это вопрос, который я начал на форуме Analog Device:

http://ez.analog.com/message/38669#38669

1 Ответ

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

Хорошо, я наконец решил проблему.проблема заключалась в том, что ассемблерный код не возвращался из функции прерывания кода vContext с RTI, вместо этого он переходил непосредственно к следующей кодовой функции ассемблера, которая была прерыванием по таймеру, которое имело ту же самую проблему, и, таким образом, указатель стека собиралсяпо следующему адресу, который является начальным адресом для функции app_init .....

Может проблема была в том, что оператор RTI был сделан в MACRO, вызываемом функцией vContextSwitch, яЯ не уверен.

Я исправил это, преобразовав эти ассемблерные функции в функцию C, и теперь стек возвращается из работы с прерываниями должным образом, и проблема исправлена.Обратите внимание, что была обнаружена дополнительная ошибка после того, что было забыто о функции загрузчика перехвата в планировщике при вызове vContextSwhitch, а также о теге функции перехвата, который никогда не записывался в контексте задачи.

Все исправленосейчас.

С наилучшими пожеланиями,

Уильям

...