问题描述
对于EDK 8.1i版本,在XilKernel v3.00a中对源文件所做的更改导致MicroBlaze设计不能正确地进行多线程。这已经在使用XMK结合lwIP库的几种设计中展示。
解决/修复方法
最新的EDK 8.1i Service Pack中已修复此问题,可从以下位置获得:
http://www.xilinx.com/xlnx/xil_sw_updates_home.jsp
对“mb-hw.c”文件的简单修改可以解决此问题。该文件可在以下目录中找到:
$ EDK / SW / lib中/ BSP / xilkernel_v3_00_a / src目录/ src目录/拱/ MicroBlaze的/
第278行是pit_reset函数的定义。此功能需要更新为以下内容:
void pit_reset()
{
unsigned int control_reg;
//从PIT器件获取控制寄存器值
control_reg = XTmrCtr_mGetControlStatusReg(SYSTMR_BASEADDR,TIMER_COUNTER_0);
//仅在安排新进程或计时器用完时才刷新预算
if(did_resched || timer_need_refresh){
//从加载寄存器重新加载间隔值并重置中断发生的掩码
XTmrCtr_mSetControlStatusReg(SYSTMR_BASEADDR,TIMER_COUNTER_0,
control_reg | XTC_CSR_LOAD_MASK | XTC_CSR_INT_OCCURED_MASK);
//删除加载掩码并启用计时器
XTmrCtr_mSetControlStatusReg(SYSTMR_BASEADDR,TIMER_COUNTER_0,
(control_reg&(~XTC_CSR_LOAD_MASK))| XTC_CSR_ENABLE_TMR_MASK);
did_resched = 0;
timer_need_refresh = 0;
} else {
//启用计时器。无需重置中断。这可以通过先前的条件涵盖
XTmrCtr_mSetControlStatusReg(SYSTMR_BASEADDR,TIMER_COUNTER_0,
(control_reg | XTC_CSR_ENABLE_TMR_MASK));
}
}
没有回复内容