跳至主要内容

VxWorks对中断的处理

我们平时使用intConnect调用挂接中断向量实际是将中断处理函数连接到vxworks内部的一个中断向量表,以MIPS为例,这个表为excBsrTbl,前几项与MIPS处理器的定义相同,但在后面保留了许多向量作为扩展使用。

intConnect为用户提供的回调函数与指针分配一小块内存(通过intHandlerCreate),并调用intVecSet将它设置到excBsrTbl中去。
intHandlerCreate用4条指令包装了用户函数,为原本不支持参数的中断处理函数提供了参数传递的功能。
FUNCPTR intHandlerCreate
(
FUNCPTR routine, /* routine to be called */
int parameter /* parameter to be passed to routine */
)
{
FAST UINT * pCode; /* pointer to newly synthesized code */

pCode = (UINT *) malloc (sizeof (intConnectCode));

if (pCode != NULL)
{
/* copy intConnectCode into new code area */

bcopy ((char *)intConnectCode, (char *)pCode, sizeof (intConnectCode));

/* set the addresses & instructions */

pCode [0] |= HI_WORD (routine);
pCode [1] |= HI_WORD (parameter);
pCode [2] |= LO_WORD (routine);
pCode [4] |= LO_WORD (parameter);
}

/*
* Flush the cache so we don't get instruction
* cache hits to wrong vector
*/

CACHE_TEXT_UPDATE ((void *) pCode, sizeof (intConnectCode));

return ((FUNCPTR)pCode);
}

封装代码与体系结构相关,下面是MIPS的代码,从注释中容易得知其作用,实现利用了指令的二进制编码形式,是一个较为巧妙的思想。
LOCAL UINT intConnectCode [] = /* intConnect stub */
{
/*
* 0x0: 3c08xxxx lui t0,xxxx * msh routine address
* 0x4: 3c04yyyy lui a0,yyyy * msh parameter load
* 0x8: 3508zzzz ori t0,t0,zzzz * lsh routine address
* 0xc: 01000008 jr t0 * jump to routine
* 0x10: 3484pppp ori a0,a0,pppp * lsh load in BD slot
*/
0x3c080000, /* msh routine address runtime load */
0x3c040000, /* msh parameter load runtime load */
0x35080000, /* lsh routine address runtime load */
0x01000008, /* jump to routine */
0x34840000, /* lsh load in BD slot runtime load */
};

然而MIPS异常0代表中断,又如何支持多个中断?这是由于vxworks提供了一个excIntStub中断处理函数作为异常0处理函数,然后根据中断位来分发中断。
这里涉及到两个表:sysHashOrder, IntPrioTable。sysHashOrder表是一个哈希表实现,在多个中断Pending情况下,两个表联合确定最高优先级的中断及该中断的信息。

vxworks提供了两个默认的哈希表,ffsMsbTbl和ffsLsbTbl,它们分别代表高位高先级和高位低先级,对于XLR,我们使用ffsMsbTbl,请看定义:
UINT8 ffsMsbTbl [256] =
{
0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
};
MIPS一共有8个中断位。当多个中断来临时,假定最高位为N,那么2^N范围内的中断都取第N个中断为下一个处理的中断,按这种方式便可以将该表定义出来。
数组的值是对IntPrioTable的索引,在XLR中,定义如下:
PRIO_TABLE intPrioTable[8] =
{
{CAUSE_SW1,(ULONG) IV_XLR(IV_SW0), 0x0100, 0}, /* sw trap 0 */
{CAUSE_SW2,(ULONG) IV_XLR(IV_SW1), 0x0200, 0}, /* sw trap 1 */
{CAUSE_IP3,(ULONG) IV_XLR(IV_HW0), 0x0400, 0}, /* Uart0 */
{CAUSE_IP4,(ULONG) IV_XLR(IV_HW1), 0x0800, 0}, /* Hardware int 1 */
{CAUSE_IP5,(ULONG) IV_XLR(IV_HW2), 0x1000, 0}, /* PCIX */
{CAUSE_IP6,(ULONG) IV_XLR(IV_HW3), 0x2000, 0}, /* Demultiplex */
{CAUSE_IP7,(ULONG) IV_XLR(IV_HW4), 0x4000, 0}, /* Hardware int 4 */
{CAUSE_IP8,(ULONG) IV_XLR(IV_HW5), 0x8000, 0} /* Compare(Timer 0) */
};
IntPrioTable表提供了异常向量,中断向量,掩码等信息,有了中断向量,vxworks便可以通过excBsrTbl表找到中断回调并调用。

评论

此博客中的热门博文

反转剧

这两天明显感到天气转冷,呱呱的家里也已经下起了大雪,南京则是阴冷潮湿,让人没有了出行的欲望。没想到躲在被子里看反转剧也成了度过寒冬的一剂良药。在PPLive越来越让人失望的时候,PPStream横空出世,虽然广告仍是少不了的主题,但从视频质量和播放连续性上来说都超过PPLive,实为居家必备之良品(由此可见,新事物一定会战胜旧事物......)。韩国的反转剧最近似乎比较流行,称之为反转剧就在于其结果总是让人出乎意料,不合常理,其间又不乏各种搞怪搞笑的镜头,各种当红帅哥美女也一定让DDMM们爱不释手,20~30分钟一集的剧情一改韩剧拖沓的风貌,想看就看,容易切入。 反转剧,今天你看了吗?

Computer Systems: A Programmer's Perspective

Bryant, R.E所著的这本Computer Systems: A Programmer's Perspective,在国内翻译为《深入理解计算机系统》,由中国电力出版社2004出版,应该算是一本重量级的书了。从同学推荐到今天看完,足足花了有5个月的时间,虽然看得不深,但总的感觉还是不错,在这里就对它作一个总结吧。 Computer Systems表明这本书讲解的是计算机系统知识,但A Programmer's Perspective却又告诉我们它与其它书籍的不同之处,便是从程序员的角度,即偏向软件的角度,而不过多地涉及硬件内容。计算机系统本身就是一门涉及面广,内容繁多的学科,这本书不可避免地从各个角度讲解了这些内容。下面以我个人的观点进行一些总结。 第1章:计算机系统漫游 主要是对全书内容作了一个简要的概括。 第2章:信息的表示和处理 这一章主要讲解了整数与浮点数。虽然对于整数我们已经很熟悉了,但是在实际中仍会犯下各种各样的错误,书中对不同整型数间的转换及运算作出了很详细的论述。浮点数似乎一直是计算机书籍里不愿涉及的话题,对于想了解浮点数表示及浮点数运算的人来说,这部分关于浮点的描述可以作为一个很好的起点。 第3章 程序的机器级表示 对于任何一个希望了解底层的人来说,这一章可说是相当精彩的。本章主要讲解了IA32的指令集,因此以汇编为主,在控制流指令部分还将C语言及对应的汇编形式进行了对照,在调用部分还详细讲解了本地栈。最后为对浮点感兴趣的人准备了IA32中用于处理浮点的指令集。 第4章 处理器体系结构 这一章是本书中最接近硬件的部分了,从设计一个简单的处理器Y86出发并逐步完善它,一步步地引导读者理解处理器体系结构。虽然我们可能永远也不会自己设计处理器,但了解它是何工作的能有助我们理解整个计算机系统是如何工作的,比如对程序优化就很有帮助。本章首先给出了Y86的指令集,并使用一种硬件描述语言HCL对硬件的逻辑结构进行了描述,然后将指令分成取指、译码、执行、访存、写回、更新PC六个阶段,给出了每条指令的每一部分的操作内容,并对每一部分的硬件实现分别进行了讨论。显然,这种顺序的实现过程是低效的,本章的后面部分便围统着流水线的实现以及遇到的问题展开了论述。 第5章 优化程序性能 本章介绍了一些代码优化的内容,如前面所说,只有理解了处理器系...

biblioscape, endnote, no, none of them

endnote在与word2003搭配时经常占据严重的CPU,非常不好用。今天听说biblioscape好,下之,唉,高兴的日子总是那么短暂,BUG一堆。它只支持rtf格式的转换,在word里format时,还要转为rtf格式后再转回来。甚至在重复转换过程中也产生了不一致,可能它在RTF和DOC之间的转换没有那么精确吧。好想用latex排,不过时间紧迫,现在懒得去学了。 都不用了,还是手工输入参考文献罢了。也许,open office?下一个先。