Embedded 加载任务时,blackfin bf561 FreeRTOS实现在运行时失败

Embedded 加载任务时,blackfin bf561 FreeRTOS实现在运行时失败,embedded,runtime,real-time,freertos,Embedded,Runtime,Real Time,Freertos,我在Blackfin BF561 coreB FreeRTOS中实现了以下代码: 我使用gcc将裸机转换为elf可执行文件 我很接近,但我有一个运行时错误,我无法排除。当调度程序启动并尝试触发第一个任务时,内存指针丢失,它不会启动第一个堆栈,而是在第一个任务内启动一个函数,在退出该函数时丢失 这是相应的调试日志: COREB: end setup LED COREB: han

我在Blackfin BF561 coreB FreeRTOS中实现了以下代码:

我使用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  
这是我在模拟设备论坛上开始的讨论:


好的,我终于解决了这个问题。问题是汇编程序代码没有从RTI的vContext代码中断函数返回,相反,它直接进入下一个汇编代码函数,这是一个计时器中断,它也有同样的问题,因此堆栈指针随后进入下一个地址,而下一个地址恰好是app_init函数的起始地址

可能是因为RTI语句是在vContextSwitch函数调用的宏中生成的,我不确定

我通过将这些汇编函数转换为C函数来修复它,现在中断返回的堆栈工作正常,问题得到了解决。请注意,在调用vContextSwhitch时,调度器中的钩子任务加载器函数以及从未在任务上下文中记录的钩子函数标记被遗忘之后,发现了其他错误

现在都修好了

致以最良好的祝愿

威廉