论文情况汇报

呵呵,这段时间里用写了两篇论文。
 
其中一篇关于FPGA的已被录用,计算机工程,中文核心期刊要目,EI page one
另外一篇关于VLSI设计的文章,投到西安电子科技大学学报,不出所料的被打回。不过搞笑的是,从收到他们的论文收到邮件到退稿邮件一共花了一个半小时,他们的效率还真是高。只能说我投错杂志了。换成电视技术,中文核心期刊要目。
另外一篇关于CANopen的文章计划中,估计半个月后完成。如果不错的话,今年会有3篇入账了。
 
做人要厚道,没正式出来前,还是不要透露题目和内容等等。低调。
Advertisements

ARM ADS实现基于超级终端的printf

    最近想把在PC上调通的CANopen的核心任务调度程序放到ARM上跑一跑,看看在真的CPU有多快。好不容易编译通过,但是跑起来总是进入Data Abortion,就是数据段异常退出。说明代码有问题。
    用JTAG确实可以设断点,但是一设断点就都好了。因为这是实时程序,所以一有断点就打破了实时性,自然问题也没了。我需要一种不影响实时性的调试方式。在PC机上,用Visual C++自然可以用printf,而且源代码里已经有了。但是ARM里的stdio库还不能直接支持printf,除非有操作系统。
    不过,我今天终于利用ADS自身的库函数实现了利用超级终端为输出环境的printf实现。
    其实,所有嵌入式CPU都提供了stdio的库,也提供printf函数。唯一的问题是,嵌入式CPU并不能确定输出环境,所以提供的stdio库函数并非直接可用。
    其实,printf是fprintf的特例,fprintf通过文件指针可以向任意的文件当中写字符,而printf仅仅向stdout文件当中写。所以将printf和串口连接起来,也就是将串口变成stdout。由于库函数并不确定输出的方式,一般会将一些低层的函数留出来而没有实例化,比如这里要说fputc。
    实际上,库函数已经完成了大量的工作。比如printf当中的格式化统一,数字转为ACSII码等等。唯一没有做的工作就是按字符将字符串输出,因为库函数并不知道输出目的地,比如现在我要用串口。
     也许你已经意识到需要做什么了。实例化fputc!
     库唯一没有做的就是这些太底层的实现,我们针对自己的应用重新实例化这些函数,库函数就可用了。
     printf的道理就是这样。所有的工作库函数已经实现,并且最终它会调用fputc向stdout文件写一个字符。而fputc没有实例化,直接使用库函数自然不成功。我们可以自己实例化fputc,在里面向串口发送一个数,自然就是将stdout和串口等同起来,完成了利用超级终端调试的目的。
     当然,这只是一个想法。还有很多细节,都是针对ADS系统的,属于个例的实现,花了我一天,但是他们并不重要。
     重要的是,建立嵌入式系统函数库的概念。他们只能提供他们能够提供的东西。很多的实现需要进一步再完成一些,这是他们和PC上函数库的不同。需要体会到的条件反射是,如果函数库提供了一些有用的东西,就一定能用。即使表面上他们有问题,但是一定有简单的方法让他们工作。
     在这里我参考了ADS的文献,它的例子当中提供了类似的应用,帮助很大。相信其他的系统也会是相似的。