今天,有网友在群里提问“我这个简单的闪灯程序(无其它任何多余的逻辑或*.c),运行久了,居然会死机!运行环境:EPCQ+片上RAM+NIOS II的方式。时钟:37.125MHz,通过JTAG电缆Debug NIOS,则不会。这是怎么回事呀 ?”
相信这样一个问题,很多人都遇到过,我之前在做NIOS II应用开发时,也遇到过这个问题,当时怀疑是NIOS II不稳定导致的,因为各大网络论坛和QQ群,吐槽NIOS II处理器鸡肋的实在是太多了。这里,小梅哥不去评判NIOS II处理器究运算竟性能几何,稳定性如何,因为各人有各人的观念和实际大环境,有的公司打死不愿用NIOS II,而有的公司做产品却离不开NIOS II。对于一个Altera推广了十多年的软核处理器,我不相信经过十多年的发展,还存在这么弱智的BUG。
该网友的问题,实际是可以合理解释并且解决的。
因为jtag uart实际是由jtag模拟的,本质上是个fifo,当你在NIOS II中使用printf(alt_putchar、alt_printf、alt_putchar)函数时,实际是将需要发送的数据写入了这个fifo中,这个fifo中的数据由PC机上的NIOS II EDS软件中附带的程序通过JTAG协议去读取并显示在NIOS II Console中。
那么,假如因为某些原因pc上的console断开(用户手动关闭Console通信,或者JTAG线缆被拔掉),则不会再有程序去持续读取这个fifo中的值,因此,一旦NIOS II中仍旧有发送请求,则会继续去写这个FIFO,因为没有PC机去及时读取这个FIFO中的值,所以当FIFO被写满之后,则NIOS II的JTAG UART驱动会判断得到当前发送FIFO已满,不能再写入数据,因此程序会一直停在这个地方等待,直到FIFO中的数据被读走一部分,以有足够的空间写入需要发送的数据。
所以,因为console已经断开了,所以永远不会再去读取FIFO中的值了,因此这个FIFO在被写满之后也将永远处于满状态,不能再写入新的数据,所以NIOS II CPU的程序也会一直卡在发送函数这里,不会继续执行,就发生了程序死机的现象。
另外,大家可能遇到过,带JTAG UART的并经常有数据通过JTAG UART传输的系统,在运行过程中,我们去进行一下其他的操作,然后Eclipse for NIOS II就停止响应了,程序会强制退出,其实也是受这个JTAG UART的影响。我就经常因为不小心就这样把eclipse搞死了,所以我现在比较保守了,一半不使用JTAG UART进行调试,而是直接用RS232 UART来进行调试。
小梅哥
2016年1月29日
芯航线电子工作室
文章评论(0条评论)
登录后参与讨论