完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
大家好,我有一条消息要显示在PIC24EP512GU810上的液晶显示器上,消息可以变化,所以我有一个函数,检查每100ms改变一个字符串。我每次都使用变量访问这些字符串,所以编译器生成代码来管理它们。最初,显示函数被更频繁地调用(在主循环的每一轮中,但是即使出现10ms延迟的问题),但是调试器会在未知的断点上停止。(“由于用户代码中的软件断点而停止的目标”)。当没有在调试模式下运行时,程序会重复重置。通过尝试几件事,我发现问题在于对psv指针的重复访问太快。到目前为止,在调试模式下,即使有100ms的延迟,微控制器也会以随机的间隔(从几秒到4-5分钟不等)复位。我的问题是,我能够访问编译器管理的psv变量的频率有没有限制?作为参考,这是我的代码:main.ctimers.cdisplay.cI使用这个函数访问psv内存部分:PS:我不确定这是否是张贴的正确论坛,但我找不到我的微控制器的特定论坛
以上来自于百度翻译 以下为原文 Hello everyone, I have a message to show on a lcd display on a PIC24EP512GU810; the message can vary, so I have a function that check to change a string every 100 ms. The different messages are stored in the program memory using __attribute__((space(psv))). I access those strings every time by using __psv__ variables, so the compiler generates the code to manage it. Initially the display function was called more frequently (in every round of the main loop, but the problem presented even with a 10 ms delay), but the debugger would halt on an unknown breakpoint (" Target halted due to Software Breakpoint in user code "). When not running in debug mode the program would repeatedly reset. By trying several things I figured out the problem lays in too fast repeated access to the psv pointer. As of now, with a 100 ms delay even in debug mode the microcontroller resets at random intervals (ranging from few seconds to 4-5 minutes). My question is, are there limits on the frequency with which I can access compiler-managed psv variables? For reference, here's my code: main.c while(1) { /*...*/ if (f_agg_status_display == 1) { Display_Status(); f_agg_status_display = 0; } /*...*/ } timers.c /*----------------------------------------------------------------------------*/ /* Timer Interrupt 3 - 100msec */ /*----------------------------------------------------------------------------*/ void __attribute__((interrupt, no_auto_psv)) _T3Interrupt(void) { IFS0bits.T3IF = 0; // Clear Timer 3 Interrupt Flag LED_RUN ^= 1; f_agg_status_display = 1; } display.c void Display_Status (void) mymemcpy (&stringa_status[0], &str_table_stato[stato], 16); } I use this function to access the psv memory section: void mymemcpy(unsigned char* str, __psv__ void * msg, int len) { int i; for (i = 0; i < len; i++) { str = ((__psv__ unsigned char *)msg); } } PS: I'm not sure if this is the correct forum to post in, but I couldn't find the specific one for my microcontroller |
|
相关推荐
3个回答
|
|
如前所述,设置陷阱处理程序。由于您已经编写了更改psv页的代码,因此我认为任何访问PSV的中断都需要设置默认PSV,因为编译器通常不包括用于访问默认PSV区域的PSV页代码。你使用NoYAutoPSV的中断可能是一个候选,也许你还有其他的中断!因此,尝试先将AutoPSPV添加到中断中。
以上来自于百度翻译 以下为原文 As already said, setup the trap handler. As you have code the changes the psv page, then I would think any interrupt that accesses PSV will need to setup the default PSV as the compiler would not normally include PSV page code for accesses to the default PSV area. Your interrupt that uses no_auto_psv might be a candidate and maybe you have other interrupts as well! So try adding auto_psv to the interrupts first. |
|
|
|
同上AutoPSPSV上的点…如果从中断访问常量(即PSV)数据,则如果在主代码中有不止一个PSV值,则必须是auto-psv。请参见代码中的MCONST。请注意,片上EEPROM接入将需要PSV操作。症状?从痛苦的经历,偶然的地址陷阱!而且,如果你减少你的中断频率,它就变得不那么频繁了。现在,关于更新状态显示,人眼需要大约100ms来响应和处理很多事情,所以这实际上就是状态显示需要的所有更新频率。也可能要检查,看看液晶显示器是否变得缓慢,当它变冷了!
以上来自于百度翻译 以下为原文 ditto the point on auto_psv... if you access const (i.e. PSV) data from an interrupt, it *must* be auto-psv if you have more than one PSV value in the main code. See -mconst-in-code. Be aware on-chip EEPROM access will require PSV manipulations. The symptom? From bitter experience, a stray address trap at random times! And, if you reduce your interrupt frequency, it gets less frequent. Now, as to updating that status display, the human eye takes about 100ms to respond to and process much of anything, so that really is just about all the update frequency the status display needs. Might also want to check to see if the LCD gets slow when it gets cold! |
|
|
|
谢谢大家的快速回复。我已经检查了问题的各个方面,并最终找到了原因。添加陷阱处理程序让我发现它确实是地址错误导致重置;特别是PC最终的地址不均匀。过了一段时间,我花了很多时间寻找错误的位置。ter类型转换和无效的psv使用,Eric的建议为我指明了正确的方向:我有两个计时器中断,它们正在访问常量变量。起初我并没有注意到它,因为那些变量不是_u psv_变量,但是作为常量仍然放在默认psv窗口中。
以上来自于百度翻译 以下为原文 Thanks everyone for the fast replies; I've looked at every aspect of the problem and eventually found the cause. Adding trap handlers allowed me to find it was indeed an address error causing the reset; in particular the PC ended up having an uneven address. After a while spent looking for wrong pointer casts and invalid psv usages, Eric's advice pointed me in the right direction: I had two timer interrupts that were accessing const variables. I didnt notice it at first because those were not __psv__ variables, but as const were nonetheless placed in the default psv window. Setting the interrupt as auto_psv from no_auto_psv was enough to get rid (hopefully, I'm testing it extensively right now) of the error. |
|
|
|
只有小组成员才能发言,加入小组>>
5081 浏览 9 评论
1954 浏览 8 评论
1888 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3116 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2189 浏览 5 评论
634浏览 1评论
511浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
372浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
539浏览 0评论
441浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-1 17:55 , Processed in 1.144842 second(s), Total 81, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号