在pic32平台下调通uart发送和中断接受,但尝试打开finsh,却总是编译通不过
今天终于有空在pic32 Ethernet stater kit上调试RTT,依照STM32F107中串口驱动的写法,移植到pic32上。写了个回显的线程,显示串口发送和中断接收是正常,然后继续调试finsh,发现编译通不过。编译器提示“undefined reference to 'strdup'”和“undefined reference to '_alt_partition_FSymTab_start'”等。我想请问一下不是说finsh是用C实现的吗?移植起来应该直接可用把,那为什么编译通不过? 这个需要处理一下. _alt_partition_FSymTab_start是因为从NIOS里同复制的,需要改改.(已改但因为串口中断有问题所以没提交)
另请帮测试一下芯片的中断是否有问题.我的芯片老发现会出两次中断.
稍候给楼主发邮件. 对于pic32 uart中断来说,出现这些问题都是正常的,以前一项目中使用串口发送中断调试了老长时间,后来调试串口接收中断也有问题,都是出现不可预料的进入中断,但还是可以使用软件避免。
你可以放上来,我明天到公司给你测一下。 再问一下这次提交的版本会不会支持以太网? 已提交串口和finsh相关的. 串口有问题, 表现在 我PC发送一个字节如0x61,会发生两次接收中断,于是finsh返回 0x61 0x00.
以太网按官方的驱动修改了一下,可以ping通.但也存在串口一样的问题,收到一个包会发生多次中断.
加上改得乱78糟.所以就不提交了.
串口修改了一份已发到你邮箱. 能否发到这个帖子上,我在公司打不开外面的邮箱。 点击此处下载 ourdev_673174DXJBYA.zip(文件大小:2K) (原文件名:uart.zip) 我代码发不出来,要不我就放上来了。
看了你的代码,大致上发现你在读取串口数据时,没有判断是否available。在available时再去读数据应该就ok了。
另外你的代码很多都是直接操作寄存器的,能否使用库函数呢?
还有uart写数据时,不用等待写完吧,pic32的串口有fifo的。
想请教你一下,那个finsh部分怎么搞啊。是要在ld文件中把符号定义增加到.text段中吗?看stm32是这样做的,
那就是要改elf32pic32mx.x,但这个文件mplab不识别。所以该如何处理? 目录里面有个.ld文件,那个是链接脚本之一。 具体看自带的示例。 回复【8楼】ffxz
目录里面有个.ld文件,那个是链接脚本之一。 具体看自带的示例。
-----------------------------------------------------------------------
谢谢ffxz,我明白了 "没有判断是否available。在available时再去读数据应该就ok了"
代码是按自带的示例写的.
可能需要判断available,但中断会进两次的原因依然没查清楚..
"另外你的代码很多都是直接操作寄存器的,能否使用库函数呢? "
当然可以.这个无关紧要.只要能实现需求.
"还有uart写数据时,不用等待写完吧,pic32的串口有fifo的。 "
那应该改为等待FIFO有空即可写入.
楼主的芯片测试会进两次中断吗? 也有这个问题吧,但我都忽略它了,因为使用软件处理了。明天看看能否查找到原因。
另外发现编译器有如下警告:
../../../libcpu/mips/pic32/context_gcc.S: Assembler messages:
../../../libcpu/mips/pic32/context_gcc.S:38: Warning: Tried to set unrecognized symbol: mips3
../../../libcpu/mips/pic32/context_gcc.S:38: Warning: Tried to set unrecognized symbol: mips0
../../../libcpu/mips/pic32/context_gcc.S:53: Warning: Tried to set unrecognized symbol: mips3
../../../libcpu/mips/pic32/context_gcc.S:53: Warning: Tried to set unrecognized symbol: mips0
../../../libcpu/mips/pic32/context_gcc.S:121: Warning: Tried to set unrecognized symbol: mips3
../../../libcpu/mips/pic32/context_gcc.S:121: Warning: Tried to set unrecognized symbol: mips0
这个有没有什么隐患? 备份ourdev_673310ZLSKZL.rar(文件大小:368K) (原文件名:pic32ethernet.rar)
再次备份一下
自己备份ourdev_673592OHZHRB.rar(文件大小:348K) (原文件名:pic32ethernet.rar) 原因查明,我在进入中断时,先清中断标志,然后读取数据,结果会再进一次中断。以前也有发现这个问题,后来没去总结。
因为我写的驱动是从STM32F107移植的(最后才清中断标志),所以碰不到这个问题。
我们可以在出中断时再去清中断标志位。
还有pic32的spec关于一些细节都没有介绍,网上也没有这方面的使用讨论,FAE就熟悉example,问了也白问,真是让人蛋疼。
另外我finsh还没调好,我是按照explicit_linker_script做的,没成功,求指点啊!上面是相应问题文件,帮忙看看什么问题。密码flor 回复【11楼】flor独臂老人
-----------------------------------------------------------------------
关系不大. 上下文切换使用的是MIPS共用部分.而PIC使用的是MIPS M4K核,所以有些标记不支持.
而JZ和龙芯都是支持的,所以这里不好修改,少数服从多数,先无视了.
如果实际项目中,可以根据实际情况去掉这些. 回复【14楼】aozima
回复【11楼】flor独臂老人
-----------------------------------------------------------------------
关系不大. 上下文切换使用的是mips共用部分.而pic使用的是mips m4k核,所以有些标记不支持.
而jz和龙芯都是支持的,所以这里不好修改,少数服从多数,先无视了.
如果实际项目中,可以根据实际情况去掉这些.
-----------------------------------------------------------------------
如果确实不同,这部分建议独立出来,没必要大家一起使用。 回复【13楼】flor独臂老人
-----------------------------------------------------------------------
默认elf32pic32mx.x中会INCLUDE procdefs.ld
每个型号都有一个私有的procdefs.ld,里面的size等都不同.
而elf32pic32mx.x是公用的.里面的内容一般不建议随意修改,除非确认修改是无误的.
工程文件所在目录处在搜索目录中靠前,所以当工程目录中有procdefs.ld时,会优先使用工程目录中的.不然会根据型号选择对应的.
而且procdefs.ld比较简单,且size是在这里设置的.比较合适.
所以建议使用自定义 procdefs.ld 来实现添加section. 回复【16楼】aozima
回复【13楼】flor独臂老人
-----------------------------------------------------------------------
默认elf32pic32mx.x中会include procdefs.ld
每个型号都有一个私有的procdefs.ld,里面的size等都不同.
而elf32pic32mx.x是公用的.里面的内容一般不建议随意修改,除非确认修改是无误的.
工程文件所在目录处在搜索目录中靠前,所以当工程目录中有procdefs.ld时,会优先使用工程目录中的.不然会根据型号选择对应的.
而且procdefs.ld比较简单,且size是在这里设置的.比较合适.
所以建议使用自定义 procdefs.ld 来实现添加section.
-----------------------------------------------------------------------
谢谢,很详细。
但是我在ld文件中增加
__fsymtab_start = .;
....
....
__vsymtab_end = .;
把finsh中所有C文件加入到工程中,打开finsh,编译提示 finsh_var.c:100: undefined reference to 'strdup'
这是不是说这个函数被优化掉了?
还有连个提示:ld.exe: small-data section exceeds 64KB; lower small-data size limit (see option -G)
和
relocation truncated to fit: R_MIPS_GPREL16 against '__fsymtab_start'等
这也不明白。 aozima:
搞的头大,也没编译成功。能不能给个编译通过的例子? SVN中不是已经更新了么??????? ld.exe: small-data section exceeds 64KB; lower small-data size limit (see option -G)
这个搜索 MIPS GP 64K
finsh已为符号表加上const修饰.不会出现这个了.
如果以后全局变量超64K,可以在编译参数里面加上-Gn(-G0即为不使用GP) 没去关注svn更新,刚去下载了一份,发现几乎天天有更新。
照svn版本和我使用的比对了一下,发现
finsh_var.c:100: undefined reference to 'strdup'
是使用#define RT_USING_NEWLIB引起的,看来我对rtt的一些设定还是非常不了解啊,以后还要多学习。
感谢aozima和ffxz 学到不少东西啊 strdup这些.编译器自带的库可能有,可能没有...是个很恼火的问题.
单片机的库都实现得不全.每个平台都不一样.是很让人头大.
不知道有什么好的解决办法 我还不懂strdup是干什么的,百度了一下好像=malloc+strcpy
这个系统里面有好多东西都比较陌生,不知该如何学起啊! 回复【3楼】flor独臂老人
再问一下这次提交的版本会不会支持以太网?
-----------------------------------------------------------------------
改进了一下驱动.目前仅实现简单地收发功能.还没能让描述符环表转起来.
点击此处下载 ourdev_675307T68HJ1.zip(文件大小:804K) (原文件名:rt_thread_pic32_lwip_test.zip) 回复【24楼】aozima
回复【3楼】flor独臂老人
再问一下这次提交的版本会不会支持以太网?
-----------------------------------------------------------------------
改进了一下驱动.目前仅实现简单地收发功能.还没能让描述符环表转起来.
点击此处下载(原文件名:rt_thread_pic32_lwip_test.zip)
-----------------------------------------------------------------------
太好了,我正在学习pic32 eth的example,多谢啊。 回复【25楼】flor独臂老人
回复【24楼】aozima
回复【3楼】flor独臂老人
再问一下这次提交的版本会不会支持以太网?
-----------------------------------------------------------------------
改进了一下驱动.目前仅实现简单地收发功能.还没能让描述符环表转起来.
点击此处下载(原文件名:rt_thread_pic32_lwip_test.zip)
-----------------------------------------------------------------------
太好了,我正在学习pic32 eth的example,多谢啊。
-----------------------------------------------------------------------
请方便时帮把eth驱动修修,现在是照给的示例改的,很多地方搭配不太好.
另外.移植应该还是有问题的.现在还没有给这个分支做过任何测试.发现经常会发生bus error.
而现在的跟综功能没有.看来有空得研究一下MIPS如何跟综回去.好找出问题点.
页:
[1]