跳至主要内容

博文

MIPS中断在uboot下的实现

摘要:本文阐述了MIPS中断在u-boot下的整个实现过程,并对实践中遇到的问题进行了分析,特别分析了u-boot所采用的位置无关代码及汇编实现的特殊性,对类似应用具有较好的借鉴意义。 随着Linux嵌入式系统的广泛使用,使用uboot作为bootloader越来越多。u-boot发源于ppc架构8xx系列,对ppc架构的支持最为完善,而对其它架构的支持情况则要弱一些,以MIPS为例,目前的最新版本u-boot-2010.03仍然不支持异常和中断的处理。缺少中断机制带来了一些麻烦,比如不能支持统一的点灯规范,更重要的是在无中断的单任务环境下,协议栈缺乏有效的超时重传机制,在复杂的框上环境中,单板容易假死在boot中。 本文描述了MIPS架构中断在u-boot下的实现过程,并对遇到的问题进行了分析和总结。我们首先讨论了通用的异常处理过程,然后结合代码实现对异常处理代码进行了阐述,最后对调试过程中出现的问题进行了分析。u-boot有其自身的特点,本文同时也对位置无关代码进行了一定的分析。 中断处理在实现上并不复杂,其处理过程可以简单地划分为下面几个步骤: 1. 保存中断上下文 2. 处理中断并应答 3. 恢复中断上下文 4. 使能中断 这种处理方式比较简单,整个中断处理是在中断环境中完成的,没有中断嵌套。对于VxWorks这样的实时操作系统,需要允许高优先级中断抢占低优先级中断,因此它的处理步骤要复杂一些,在进入中断后,只保存少量的易失性寄存器,并尽早地开启中断。因为我们只需要实现简单的定时器,所以就按照最简单的方法实现。 MIPS CPU产生中断时,CPU跳转到EBASE+0x180或者0x200(取决于COP0 Cause.IV的设置。IV=1时,中断使用0x200入口,IV=0时,中断使用通用异常入口0x180)处开始执行中断处理程序。一般来说,异常向量处的大小都是受限的,MIPS也不例外,每个异常向量的大小不能超过0x80的长度,如果要在这里进行上下文保存,空间是不够的。惯例是在这里设一处跳转,到一个大小不受限的地方开始保存上下文。 上下文的保存可以分为两种实现,一种是使用当前任务的栈,一种是使用专门的栈,对于只工作在内核态的boot来说,这两者在使用上并无差别。理论上,开辟专门的栈可靠性更高,不容易被破坏。对于不同的架构,上下文的含义不同,对MIPS而言,上下...

悼念

从未想到在我认识的人里有走得这么早的,惊闻一师兄杨志高在学校自杀,不由得悗惜。你让老师们如此钟爱,你的论文又让我们那样地景仰,你的人生为何却又如此短暂。 曾有一句话很认同,完美主义者等于失败者,真的没有事情可以做到完美。 愿你一路走好。

知识管理的原则

寻找PKM时,看到这样一个贴子,感觉有一些原则比较有启发作用,其实重要的是方法,其次是合适的工具。所谓原则,对不同人来说也不是绝对,适合自己的就好。 个人知识管理的29个原则(转) 1、持续的学习成为个人生存和发展的基础。持续学习不一定能带来成功,但不学习一定失败;  2、信息和知识爆炸,在一段时间和时期内,学习的内容必须聚焦。起码要在一个领域内成为专家。  3、你应该学习的内容取决于你的价值观、特长、个性和目标。  4、你必须学会如何有效的评估信息和知识,所以你必须根据你的价值观、特长、个性和目标确立自己对信息和知识的“过滤器”;  5、人是知识获取的重要渠道,所以你应该知道谁最擅长什么?遇到问题时知道可以向谁学习和请教;  6、你牛了你的朋友也一定牛,建立人际资源的基础是自己的知识基础、个性和激情、自己优势的合理展示和帮助别人的意愿;  7、人际关系需要维护;捷径是找到那些愿意共享自己朋友资源的人,你也应该做这样的人;  8、信息如果不经过处理,不能称为知识。所以你存储的知识起码你应该简单看过、知道是在讲什么;  9、信息和知识存储前应该尽可能做规范化的工作,例如你做的摘要、感触、觉得最有价值的部分、将来能做什么用等等;  10、建立自己的分类字典,而不是每次想起什么就建立什么样的文件夹或者标签。分类字典,持之以恒坚持,适当调整;  11、知识存储中分类不宜过宽,过宽则等于没有分类;分类不宜过深,过深后你就不会再去看;  12、充分利用各种工具,尤其是web2.0工具做知识存储和获取工作;  13、知识存储时适当共享,听取和收集别人的意见和建议;  14、有意识的做知识显性化的工作,既方便知识传播也促进知识学习和建立人际网络;  15、知识传播中必须考虑传播的方式和效率;  16、不能用简单朴素的语言表述的知识证明你还没有深入理解;  17、多用举例子、讲故事的方法传播你的知识、见解。这个过程是你对知识的再深化过程;  18、你的知识传播的越广,你的影响力越大;  19、你的目的决定了你知识利用的方式。如果目的是要写论文,则你的知识就是明确、简洁的表达;如果是想要在市场上销售,就必须产品化、规范化或者专利化;  20、知识本身没有价值,只有被利用时才能展现其价值;  21、知识必须跟任务、项目结合起来才能发挥作用;  22、单独的一个主题的知识很难被很好的利用,...

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 (intCo...

container_of

Linux常用container_of宏从成员变量提取整个结构体的首地针,这个宏的定义如下: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) typeof是gcc的一个扩展,用于确定一个变量的类型,有点像C++的RTTI,常用于表达式内的语句,在定义宏时,如果需要临时变量,可以这样做: #define max(a,b) \ ({ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; }) 它可以保证我们定义的变量_a/_b与宏传入的变量a/b类型匹配,而不会产生编译器告警。 因此container_of的第一行就是定义一个与member类型匹配的变量__mptr,赋值后,__mptr为宏参数中的待转换指针,因为只是类型转换,不涉及数据读写,((type*)0)是没有任何副作用的。 第二行用__mptr减去member变量在type中的偏移,这样便可实际访问到ptr相同偏移,也即type的实际首地址了。offsetof有两种定义: #ifdef __compiler_offsetof #define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER) #else #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #endif __compiler_offsetof即__builtin_offsetof,__builtin_offsetof可能是gcc內建的支持(见gcc源码c-parser.c), 从后一种实现方式可以明显看到这一技巧,假定一个从0地址开始的结构体,取其成员member的地址正是结构体内的偏移。

低谷

近段时间,小猪的身体不好,连续好几个周末游走于各个医院,两人的心情也坏到了极点。现在的小猪已俨然成为一个药罐子,不再提当年之勇。这个周末又发起烧来,像一滩烂泥似地躺在床上,真是祸不单行。 而我呢,由于前任离职的缘故,现在出奇地忙,每天就像打仗似地,压得人喘不过气来,工作与家庭,真有些夹缝中求生存的感觉,两头都要兼顾,我想这一次我们是真的走到一个低谷了吧。 希望这一切都会过去,一切都能圆满地解决。

JTAG链路快速扫描方法

充分利用现有标准作为基础,是保证方案稳定而有效的一个原则。本文分析了IEEE1149.1协议,在与标准兼容的基础上,提供了一种快速扫描JTAG链路的方法。 根据 IEEE1149.1-2001 ,存在如下规则: 在 Test-Logic-Reset 状态下,测试逻辑被禁用,器件正常工作。 TAP 在下列条件下会进入 Test-Logic-Reset 状态:( a )上电,( b ) TRST 置低电平,( c )通过 TMS 与 TCK 迁跃状态。不论 TAP 当前的状态如何,在连续 5 个 TCK 的上升沿将 TMS 保持为高,即可使 TAP 进入 Test-Logic-Reset 状态。 每个设备都必须提供 BYPASS 指令,如果提供设备标志寄存器,则必须同时提供 IDCODE 指令。 在 TAP 的驱动下,进入 Test-Logic-Reset 状态后, IDCODE 指令必须在 TCK 下降沿被锁存到指令寄存器(如果设备不提供 IDCODE 指令,则锁存 BYPASS 指令)。所有 TAP 状态的切换必须在 TCK 的上升沿发生。 BYPASS 数据寄存器长度为 1 ,在 Capture-DR 状态下 TCK 上升沿,移位寄存器必须被设为 0 。 IDCODE 数据寄存器长度为 32 ,在 Capture-DR 状态下 TCK 上升沿,移位寄存器被设为设备标志码。设备 ID 数据寄存器最低位为 1 。 Manufacturer Identity 不可能为全 1 。根据 Rules 12.2.1 , 11 位的厂商代码分为两个部分: 7-1 位来自 EIA/JEP106 定义的代码的低 7 位(最高位为校验位), 11-8 位为连接码符总数目与 16 的模。目前尚不清楚厂商代码如何计算连接码,但是连接码定义为 7F ,因此 7-1 不可能为全 1 ,进而厂商代码不可能为全 1 。 00001111111 为无效的厂商代码,任何与 IEEE1149 兼容的设备都不使用该代码。 根据上述事实, JTAG 链扫描的方案设计如下: 连续产生 5 个 TCK ,并保持 TMS 为高,使 TAP 进入 Test-Logic-Reset 状态。 TDI 移入 1 位’ 1’ ,读取 TDO 。如果 TDO 为 0 转至第 3 步,...

终于可以喘口气了

连续数月的生活主题除了房子还是房子,今天签了正式合同,总算是可以喘口气了。 昨日阅读合同范本至深夜,不料今日全无用场,kfs已经将所有条款定死,完全没有商量的余地,买方永远是弱势群体。 房价已经涨得如此离谱,有人说拐点即将到来,我们是不想再等下去了,一方面对zf已经完全死心,另一方面也不愿意这么无结果地等下去,虽然到09年9月才能交付,但有盼头却是完全不同的心情。 现在,回到家,总算可以轻松一下,打打游戏,看看blog,让房价、加息、楼盘都滚到一边去吧。

久违

久违了,网络。 在这段时间里,发生了如下一些事: 1. 拍婚纱照,与选婚纱照。说起来,对龙摄影的服务不是很满意,一天安排20人就不说了,拍出来的照片,没有适合作40寸放大的,这让人非常不爽。一般最大的用的是长纱,而我们的照片里,所有长纱照片,都是小猪清晰,大猪模糊,扩洗效果可想而知。在挑照片时,我就惊人地说出了“我是一个模糊人”、“男人就是一陪衬”等等发人深省的名句,虽然那边愿意重拍长纱,这着实让人不爽,我俩均不愿意再这么干了,本来拍照时间就拖得有些晚了,再重拍可就赶不上带回家了,另外,谁都不愿意大热天地又抹一些东西、裹一些东西,出去晒太阳。遂用礼服作40寸,用古装作海报。 2. 搬家,下雨,多亏小胡才使所有被褥免遭雨洗,当晚打死蟑螂30余只,遂记念之。 3. 小王去了著名的HiTech黑砖窑,苦日子才刚开始。 4. 两周后回家,时间紧迫,要办的还很多。赚钱+睡觉是我等全部所想,而无事之人脑里总能想出一些乱七八糟的规矩,本该简办的事情,正在日趋复杂。婚礼,如同众多被强奸的事物一样,越来越像一个面子工程。

真的是鬼吹灯吗?

周末老婆出差 无聊地把网络上火爆的小说鬼吹灯下来一口气看了十几章,写得有点扯 晚上睡觉,却又想起书中幕幕,却还有点后怕,决定开台灯睡觉 午夜惊醒,看手机4点,发现灯是关的...... 逃也似地离开楼上的那个阁楼,莫非真有鬼在吹灯? MSN上一朋友说:看你被xx折磨成这样了 我不得不承认现在有些神经衰弱,常常想说什么却又想不出要说什么 也许该好好休息一阵子了

shit

这一周来网络都不好,能ping通的打不开网页,要么就ping不通,今天忍无可忍打了客服的电话,客户做到我这样,也是极品了。最终的解释是现在限制了连接数,原话:“还限制得非常狠”,靠,把BT关掉,新开一个IE连接,网页果然可以正常访问了,再把BT打开,新开一个IE连接,打不开了。这种手法也太低极了吧,就算电信怎么限制BT,人家也不会把网页的连接限制掉吧,这种处理真够憋足的! 能ping通却不能打开网页,为什么?ping应该是用的UDP报文吧,不需要建连接,FTP用的是TCP,http倒不清楚,看起来用的也是TCP。 这年头,BT,EM都不让下,还要装宽带干嘛?下HTTP?搞笑吧!

青春无悔

G G G G 开始的开始 是我们唱歌 最后的最后 是我们在走 不忧愁的脸 是我的少年 不苍惶的眼 等岁月改变 是谁的声音 唱我们的歌 是谁的琴弦 撩我的心弦 G Em C G G G G 最亲爱的 你 象是梦中的风 景 说梦醒后你会去 我相信 最熟悉你我的街 已是人去夕阳斜 人和人互相在街边 道再见 你走后依旧的街 总有青春依旧的歌 总是有人不断重演 我们的事   G Em G Em Am Em 你说你青春无悔包括对我的爱恋 你说岁月会改变相许终生的誓言 Am Em c Em D C G 你说亲爱的道声再见 转过年轻的脸 含笑的带泪的不变的眼 Am C D G Em D C G 都说亲爱的亲爱的永远 都是年轻如你的脸 含笑的带泪的不变的眼 亲爱的亲爱的亲爱永远 永远年轻 的 脸 永远永远也不变 的 眼 岁月匆匆,不经意间的老歌勾起往事种种,仍是那么地感动,感动 曾经的风华,曾经的青春,一去不返 十一年,我失去什么,又收获了什么?只愿青春无悔

一个充电器引发的网络故障

手机没电了,回到家打开插座电源,打开电脑,插上座充,进入系统,打开FX,敲入GG,一切都那么习已为常,可是今天的网页却死也不开。电力猫有时拔号的确有问题,重新拔号就可以了,或者把猫拔了,再重新插电,可是都没有效果。开始怀疑网络故障,幻想着是不是哪里的海底光缆又断了,能上QQ,问一友,说能上。ping 无数门户网站,有时通,有时不通,有丢包现象,就是没注意time值很大。左思右想,没哪里变化啊,除了一个充电器插在猫旁边,随手一拔,邪了,网络正常了,难不成是充电器的干扰?这辐射也太大了吧! 教训:以后绝不在猫旁边插任何电子器件,垃圾座充少用为佳。

lonely one

From the past, loneliness is not a thing worth to mention, because I act so, and I like so. Things changed, however, after I met you. I finally found you are the only one who I push all my feelings upon, you gotta know that all my angers or laughters are because of you. I must confess, I need you just like you need me. Now you gone, the one who is with me everyday gone, I indeed feel lonely. I love you, my wife, the little pig.

大猪与小猪的幸福生活

今天去办了结婚证,惊叹原来流程也可以用在这里啊!真是难以想象一切仅在20分钟。 虽然今天途中出现了一些小小的波澜,我相信那也只是和谐婚姻漫漫长路的一点瑕疵而已。 现今社会,结婚真是太容易了,离婚也是...

时间管理

人一生有40年的工作时间,睡觉占了13年,吃饭2年,除去娱乐等活动,只有7.5年的时间(按每天24小时)在工作。要娶妻生子、供房、赡养父母,时间的确是一晃即过。如何安排好自己的时间,让这一生过得有意义是一个很重要的问题,课上提到了ABC方法,其实也是很简单的一种时间管理方法。有一点老师讲得很好,这是存于意识层面上的。在我看来,时间管理应分为三个部分,时间管理工具,时间管理方法,时间管理意识。一直以来,我只是停留在工具这个最低级的层面上,长期以来去搜寻自认为“合适”的软件,认为选择了正确的时间管理工具,便能做好时间管理。然而对于真正会合理管理自己时间的人,必然是根深蒂固地把时间管理印在了意识中,时时刻刻地,有意识或无意识地执行。的确,一些时间管理方法看起来就像制度,开始执行时是很别扭,但是久而久之便形成了一种习惯。当然,时间管理的方法有很多种,具体作哪种选择还有待各人的探索。GTD被炒得很火,很肤浅地用了几次,要好好研究一下,毕竟我们没有叮噹猫的时间节省机器,而且,家里也没有养叮噹猫。

天将降大任于斯人也,必先折其体肤,洗其脑袋

元宵节就这么被一个半导体扼杀了。一趟大巴把我们拉到了汤山,我在那看到了keywords:温泉、洗浴、桑拿...可是没看到司机踩刹车... 当晚便开始训练,站在操场上,看着万家烟火,寒风凛冽,想着可怜的呱呱在家一个人吃汤圆,老泪纵横。Goodbye me lover, goodbye my friend. ——James Blunt语 当天正是降温的时候,第二天,天空居然飘起了小雪点,毛衣没带,冻得发抖。下午心动过速一小时,顶着,心里在想,如果倒下了,呱呱会怎样。接下来两天气温有些回升,训练也没有那么累了,Thank God。只是冬天的太阳狠,真狠,真是狠,真他妈狠,Yeah!脸皮痛,回到南京遂开始脱皮。一觉睡到大天亮,开始为期十二天的洗脑。生活颇为FB,行动却尤为不便,拜超级BT的领导所赐。好在呱呱也将有长达半月的培训,总算不会担心她会饿死,大饼的故事? 杀!!! ——顺带记念30年的第一次军训

midi线

过年回家拿了万用表和铬铁,量了一下1月份买的midi数据线,果然是坏的,NND,知音琴行真是黑,20块的数据线卖100,还是个坏的,JS一个,强烈鄙视之! 很早就在网上查到大五口转midi port的连线图,苦于没有铬铁,昨天照着做了一个,结果没有发声,郁闷死了,今天又回头想了一会,连线图有两种解释,看的方向不对,焊点就不一样,如图: 这张图是从针脚往里画的,不是从焊点往外画,网上的文章全如出一辙,也没有个解释,容易让人混淆,不过这种似乎是标准定义,只是我等水货电工基本功不扎实也。 接好了,电脑终于可以收到琴发来的数据了,高兴!Overture可以录谱了,顺带提一下,Overture4里使用The Grand 2的音色,在乐器架设置里,点灰色的框框(我晕,N次都没发现)就可以选当前电脑可用的VST插件了,播放乐谱时,效果好多了。 The Grand 2可以单独运行,直接接受琴发来的数据,这是我最想弄出来的功能!在Grand2里没什么设置,ASIO Control Panel也进去了N次,居然没发现双击居然可以修改,我狂晕!把Input Port里的Device Name改为MPU-401就可以了。Grand2的输出与用鼠标直接点键盘的效果相差甚大,奇怪的是用Cakewalk+Rapture就挺好的,音色也不错。延迟问题是有的,因为声卡很烂,上次去电脑城被晃悠了一把,等我取了钱又跟我说SB那款没midi口,靠,当时问的时候信誓旦旦,不得已为了一个midi口跑去买了一个40块的烂声卡,还不如板载的SoundMax。话说回来,这Intel也太偷工减料了吧。 近期一定要去买个好声卡!我愤愤地说。

终于放假了兼总结与展望

终于捱放假了,不管票有多难买,路上有多挤,走亲串户有多么累,还是有无数的中国人盼望着这传统节日的到来。这次过年,两人同行,两个城市,想起来还是蛮高兴的。定票点居然不卖保险,老天保佑我一路平安吧! 在这一刻,我看不少人都对过去一年来个了总结,于是一直在想我的总结又会有哪些内容呢?却回想起了在校时的种种,好比N人圆桌火锅、猴熊夜宵面、香飘四溢皮蛋粥、不擦球的斯洛克、垂直网球、水桶游泳、欠扁的帝国时代,师英徒雄无敌,当然还有和呱呱一起的浪漫校园之旅,和同学们在一起真的是一件很快乐的事情,可惜这种感觉已经不可能再有了。学习和工作果然是一个围城,永远没有完美的一端。一年来,完成了学场向职场的过渡,完成了职场向另一个职场的跳跃,当中也认识了不少好人,这也是一件快乐的事。我和呱基本上已经安定,现在的生活还不错,业余时间睡睡懒觉、弹弹琴,我还有什么奢求呢? 展望猪年,要把婚事办了,这可是最大的一件事啰。