微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Internet以太网接口的设计与实现

嵌入式Internet以太网接口的设计与实现

时间:02-03 来源:互联网 点击:

的伪代码。

void OSCtxSw(void) {

保存处理器寄存器;/*将欲挂起的任务的CPU寄存器压入当前堆栈*/

OSTCBCur->OSTCBStkPtr = sp; /*OSTCBCur目前指向的是被打断的任务TCB,此操作

将该任务的栈顶指针保存到其OSTCBStkPtr中去,便于下次恢复时从这里获取栈顶指针*/

OSTCBCur = OSTCBHighRdy; /*OSTCBHighRdy 指向的是就绪的高优先级任务的TCB,

将其装载到OSTCBCur 中来*/

SP = OSTCBHighRdy->OSTCBStkPtr; /*取得就绪的高优先级任务的栈顶指针*/

恢复该任务的现场(); /*于是便可通过刚取得的栈顶指针恢复该任务 */

执行中断返回指令; /*若OSCtxSw含有软中断指令则需中断返回,本移植不使用软中断*/

}

表2 OSCtxSw函数的伪代码

3) OSIntCtxSw() 函数

该函数用于中断级的上下文切换。由于CPU响应时钟节拍中断后,处理器从svc进入了irq模式,并进入时钟节拍中断服务函数OSTickISR, OSTickISR函数发现若有高优先级任务需要运行,则系统不返回中断前的任务,而直接调度就绪的高优先级任务使之尽快得到执行,以保证实时性能。但是由于OSTickISR函数一开始已经保存过任务中断前的CPU现场,因此OSIntCtxSW()不需要再进行类似的操作。当OSTickISR调用 OSIntExit函数找出需要运行的更高优先级任务后,OSIntExit会将该任务的TCB指针放在OSTCBHighRdy中,然后 OSIntExit在最后调用OSIntCtxSW函数来从OSTCBHighRdy中获取堆栈指针然后恢复该高优先级任务的现场,使得其继续执行,并不再返回时钟节拍中断服务程序。显然,OSIntCtxSW函数的过程和OSCtxSW函数的后半部分操作相同,因此,OSCtxSW可以借用 OSIntCtxSW的代码。

4) OSTickISR()函数

在CPU响应时钟节拍中断后,程序指针PC发生跳转后进入该函数,由于OSTickISR调用OSTimeTick函数使得所有的延时节拍不为0的任务延时节拍数减1,并调用OSIntExit函数来找出就绪的高优先级任务,若需要切换,则最后由OSIntCtxSw来完成新任务的调度,否则仍然返回到被时钟节拍中断的任务。

②OS_CPU_C.C文件:本文件仅包括一个OSTaskStkInit( )子程序。该函数模仿TI公司的I$$SAVE库函数对任务堆栈进行初始化,被函数OSTaskCreate( )和OSTaskCreateExt( )所调用并返回任务堆栈初始化后的指针值。注意:2407A的堆栈与一般MCU不同,芯片本身的堆栈(以下简称 US)只有 8 级,无法作为系统堆栈使用,所以C编译器将它内部的2个寄存器AR0和AR1保留。AR1作为堆栈指针SP,AR0用做堆栈中临时变量指针FP(在汇编程序中不要使用这2个寄存器,如果必须使用,要关中断,并注意保存和恢复)。编译器将函数和中断压进 US ,并将其返回地址弹出放在SP(AR1)指向的堆栈中,保留当前环境,不同的是函数只保留程序要使用的寄存器,中断要调用 I$$SAVE 保存所有寄存器,返回时要跳转到(不是调用)I$$REST(这2个函数可以在RTS.SRC中看到源代码)恢复寄存器。这2个函数就像8086中的中断进入和指令IRET,是移植的基础。

③OS_CPU.H文件:内容可根据μC/OS-Ⅱ中80x86的内容进行修改。

④适当处理OSMapTbl[ ]和OSUnMapTbl[ ]:移植时还需要对μC/OSⅡ的OSMapTbl[ ]和OSUnMapTbl[ ]2个表进行适当处理,否则会出现寻址错误而使μC/OSⅡ无法正常运行,这是移植能否成功的重要因素之一。由于TMS320LF2407的存储器采用的是哈佛结构,Flash存储器(或外扩的ROM)位于程序区,因此可按如下方法处理:将μC/OSⅡ中OSMapTbl[ ]和OSUnMapTbl[ ]的数据类型从“INT8U const”改为“INT8U”,并在链接器命令文件(。CMD)中将“。cinit”块分配到Flash存储器(或外扩的ROM)中,链接选项用“。C”(ROM初始化)。这样,在程序运行时自动对数据区的RAM进行初始化,即运行时自动将“。cinit”块中的数据复制到数据区的RAM中。

按需要配置OS_FG.H,修改CPU中断向量表和外设向量表后,根据实际需要对其他文档中的内容进行相应设置即可。至此,μC/OSⅡ在TMS320LF2407上的移植就完成了。

3.2 LAN91C111的编程

对LAN91C111主要包括初始化、发送数据包和接收数据包三部分。

3.2.1 初始化

上电后,LAN91C111内部的寄存器的值设置为缺省值,CPU根据需要设置它里面的Configuration、Base和Individual Address寄存器,以保证它正常工作。

3.2.2 发送数据包流程

(1)DSP向控制器发送ALLOCATE MEMORY命令(设置MMUCOM寄存器,通常设置为0x0020)。MMU负责在控制器内部的packet buffer中为待发送的包分配存储空间。

(2)DSP查询中断状态寄

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top