• 22
  • 11月

趁着周末,又给Typecho移植了一个编辑器插件。

这个编辑器的出处是Magike。记得当时刚使用Magike时,就是很喜欢这个编辑器,不为其它原因,就因为简洁,所以就把它给移植过来了。

整这个玩意,可花了不少时间。主要原因是:Javascript几乎不会,只能凭着对程序的感觉和Google的大力支持了。

第一个遇到的问题就是:mootool和jquery两个东东的冲突了。Magike时代,用的是jquery,而typecho用的是mootool。后来,Google告诉我:主要是$符号的冲突。还好jquery有jQuery.noConflict()来解决冲突。

接下来遇到的问题就是:typecho中没有预留Toobar的位置。然后,就用jquery,强行给prepend了一个Toolbar上去。

瞎折腾了半天,最后终于给跑起来了。

下载地址

  • 18
  • 11月

最近,看了一小阵子的MIPS资料,做一下简单的记录吧。

第一是空间上的分配。MIPS空间上共分四个部份:
0x00000000 - 0x7fffffff 为kuser区,主要用于MMU映射,用于运行用户程序;<br />
0x80000000 - 0x9fffffff 为kseg0区,访问方式为Cache访问,主要用于运行无MMU系统的大部份程序或操作系统的核心程序;<br />
0xa0000000 - 0xbfffffff 为kseg1区,为无Cache方式访问。主要用于运行Bootloader程序,或映射寄存器。<br />
0xc0000000 - 0xffffffff 为kseg2区,MMU映射访问,用于运行一些管理态的程序。

需要注意的是:kseg0和kseg1都是映射上物理地址0x00000000-0x1fffffff上。
因些,程序运行的起始地址0xbfc00000实际上是物理地址0x1fc00000。

第二是寄存器。MIPS一共有32个通用寄存器。
$0 zero,该寄存器桓为0,用途较广,可用于清空其它寄存器,做一些空操作等。<br />
$1:at,主要保留用于汇编的一些宏指令。编译器可能使用到它。<br />
$2 - $3:v0 - v1,主要用于函数调用的定点返回值<br />
$4 - $7:a0 - a3,函数调用时传递的4个定点参数<br />
$8 - $15:t0 - t7,非保存的临时寄存器,可能被子程序改变其值。<br />
$16 - $23:s0 - s7,保存的临时寄存器,使用完毕需要还原原来的值。<br />
$24 - $25:t8 - t9,同t0 - t7;<br />
$28:gp,全局指针(Global Pointer),访问一些全局变量时会用到,具体用法暂时还不是太清楚 ;<br />
$29:sp,堆栈指针(Stack Pointer) ;<br />
$30:fp,帧指针(Frame Pointer) ,主要用于保存函数入口的堆栈指针。<br />
$31:ra ,执行jr,jalr后保存的返回PC地址。


第三是协处理器CP0。
用的最多的就是$12 SR和$13 CAUSE了。

暂时就先这些吧。等待以后补充。

  • 14
  • 11月

周末时间,给Typecho做了一个评论过滤插件吧。

主要功能嘛,就是可以屏蔽一些不和谐的评论。

先做好了,防患于未然。

下载地址

  • 10
  • 11月

抽空,又给Typecho换上了这套皮肤。

话说,这套皮肤,我已经用了三个Blog了。

这套皮肤的原作者是Hoofei。

第一次,用的还是风色的O-Blog,当时看到这套皮肤就很喜欢,于是就弄了过来。

后来,O-Blog一直没更新,而又一直没有标签功能,就在这时,发现了Magike!理所当然,自己弄了个程序,再加上半人工处理,把Blog数据给搬了过去,同时,已带上了这套皮肤。

再后来,“寒泥的无聊日志”停止了一段时间。Typecho就出世了,于是就到了现在,又把这套皮肤给弄过来了。

至于数据呢?在第一篇已经说过了,只能当成一份回忆了。

  • 5
  • 11月

用51移植一个小型OS时,遇到了中断方面的一个问题。

因为,51的中断有一个特性:如果多个中断同时产生中断(或者在关闭EA时发生了多个中断),在EA打开的时后,每执行一个中断,必须执行主程序的一条指令,才能进入下一个中断。据说这个主要是为了实现51的单步调试功能而设计的。我不知道是不是所有的51的特性都是这样,或者其它体系的芯片会不会这样。

这样会有什么问题呢?

在OS任务切换过程,我们会遇到以下形势的代码:

EA = 0;  //进入临界区1<br />
任务1由就绪转入等待;<br />
任务1加入等待队列;<br />
产生任务切换软中断;<br />
EA = 1;  //退出临界区1<br />
(这里将进入软中断,发生任务切换事件)<br />
EA = 0;  //进入临界区2<br />
等待队列中删除任务1;<br />
EA = 1;  //退出临界区2


我们的原意是要在退出临界区1的时候进行任务切换。然而,在临界区1的时候,有可能已经产生了其它中断,而任务切换软中断的自然优先级最低,这时候,由于中断的特性,执行完其它中断任务后,会关闭EA!!

于是,没有在我们预想的地方进行任务切换。真正的切换是等到退出临界区2后!!

接下来问题就大了:由于等待队列中已经删除了任务1,那么任务1将永远无法被唤醒了。任务1就成了一个死任务。

那么,有什么解决办法呢?

1、如果可以更改芯片设计,则改为中断后不执行任何主程序的执令。
2、提高切换任务的优先级至最高。
3、不使用软中断,而是采用直接调用函数的方法进行任务切换。
4、在临界区1与临界区2之间的区域加入足够多的NOP指令。


以上几种方法均能解决。至于详细方法,这里就不多说了。