6

私はコードからBlackfinBF561coreBFreeRTOSに実装しました:

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

gccを使用してelf実行可能ファイルとしてベアメタルに変換しました。

私は近くにいますが、理解できないランタイムエラーがあります。スケジューラーが開始して最初のタスクをトリガーしようとすると、メモリーポインターが失われ、最初のスタックは開始されません。代わりに、最初のタスク内で関数を開始し、関数を終了すると失われます。

これは対応するデバッグログです。

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  

これは私がアナログデバイスフォーラムで始めた議論です:

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

4

1 に答える 1

1

さて、ようやく問題を解決しました。問題は、アセンブラコードがRTIを使用したvContextコード割り込み関数から返されないことでした。代わりに、同じ問題が発生したタイマー割り込みである次のアセンブラコード関数に直接渡され、スタックポインタが実行されていました。 app_init関数の開始アドレスである次のアドレスに.....

問題は、RTIステートメントがvContextSwitch関数によって呼び出されたMACROで作成されたことが原因である可能性がありますが、よくわかりません。

これらのアセンブラ関数をC関数に変換して修正しましたが、割り込みからのスタックリターンが正常に動作し、問題が修正されました。その後、vContextSwhitchを呼び出すときにスケジューラーのフックタスクローダー関数と、タスクのコンテキストで記録されなかったフック関数のタグを忘れた追加のエラーが見つかったことに注意してください。

すべて修正されました。

よろしくお願いします、

ウィリアム

于 2012-02-03T07:29:26.990 に答える