|
|
View previous topic :: View next topic |
Author |
Message |
jventerprises
Joined: 01 Apr 2004 Posts: 43 Location: Boston
|
A tale of optimizers and SPI |
Posted: Thu Oct 28, 2004 6:06 am |
|
|
hi everyone,
i just spent a long night tracking down this 'feature' and wanted to run it by the group for advice. it is from 3.187 and for a PIC16F877a.
this snipet of code is from a USB HID handler i wrote. it takes data from a USB 9603 RX fifo and stuffs it out the SPI port (or returns it).
#IF USB_EP1_RX_ENABLE
if (endpoint == 1) {
if (dest == destLOCAL)
{
len = usb_get_packet(1, ptr, max);
return len;
}
else if (dest == destSPI)
{
len = 0;
while (len < max)
{
// get the next byte and send it to the SPI port
usb_get_packet(1, &data, 1);
SSPBUF = data;
while (!SPI_BF);
data = SSPBUF;
// data = data *2;
len++;
}
return len;
}
else
{
return 0;
}
}
#ENDIF
Well, that was the idea anyway. the lines in question are:
SSPBUF = data;
while (!SPI_BF);
data = SSPBUF
these take a byte of data, write it to the SSPBUF, wait for the BF flag, and then read what came in, thus clearing the BF flag. I dont need the incoming data.
with 3.187 and default optimization, it doesn't work. because i never do anything with the data from 'data = SSPBUF', the optimizer takes it out (rightly so i think). the effect is BF doesn't clear, and data starts to get lost since while (!SPI_BF) is always true, and i overwrite the SSPBUF!
to make it work with the optimizer on, i had to do the following.
SSPBUF = data;
while (!SPI_BF);
data = SSPBUF;
data = data *2;
now, the PIC reads SSPBUF fine, BF clears and my data flow is not corrupted.
Anybody have any ideas on what a 'correct' approach to solve this would be? i don't really want to turn of optimization, but the 'data = data *2' line feels like a hack to me....
i guess i could check the SSPIF interrupt flag instead of the BF flag.....
i know there must be a few opinions out there.... _________________ Jon |
|
|
jventerprises
Joined: 01 Apr 2004 Posts: 43 Location: Boston
|
Hello? |
Posted: Thu Oct 28, 2004 9:37 am |
|
|
Why doesn't anybody ever answer my posts? _________________ Jon |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Thu Oct 28, 2004 10:01 am |
|
|
Quote: | Why doesn't anybody ever answer my posts? |
Be patient. Your question is very specific and can't be answered by just everybody. You only waited 3:31 hours which is very short, especially considering most users of this forum are living in a different time-zone from where you are (your location says Boston, but you are posting at European daytime, so I guess this is not the American Boston?). |
|
|
Charlie U
Joined: 09 Sep 2003 Posts: 183 Location: Somewhere under water in the Great Lakes
|
|
Posted: Thu Oct 28, 2004 10:30 am |
|
|
I just tried your example, but used the built in functions. It appears that when you use these, you get the desired results. Here's the listing from a compile with 3.190 which is the closest I have 3.187.
Code: |
.................... while (1)
.................... {
.................... spi_write(data);
0063: BCF 03.5
0064: MOVF 20,W
0065: MOVWF 13
0066: BSF 03.5
0067: BTFSC 14.0
0068: GOTO 06B
0069: BCF 03.5
006A: GOTO 066
.................... data = spi_read();
006B: BCF 03.5
006C: MOVF 13,W
006D: MOVWF 20
....................
.................... }
006E: BSF 03.5
006F: GOTO 063
....................
.................... }
|
|
|
|
Trampas
Joined: 04 Sep 2004 Posts: 89 Location: NC
|
|
Posted: Thu Oct 28, 2004 10:34 am |
|
|
I know with the CCS if you find a feature, try another version of compiler....
I have personally spent hours finding that the I2C_write function did not work. I finally debugged the assembly to find the compiler did not implement function correct. The worst part is it worked in one version, next version of compiler had bug, next version it was fixed, next version had same bug....
Thus NEVER use CCS intrensic functions! You will spend more time debugging their functions than writting your own. But you know that now!
Trampas |
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
|
Posted: Thu Oct 28, 2004 11:11 am |
|
|
My solution is to use the built in functions, but only upgrade the compiler when I really really have to, and never in the middle of a project! I have never encountered a bug I can't live with, and I would much rather have the bugs I know than ones I don't. This doesn't just apply to CCS but to any software tools I work with including FPGA compilers and stuff from Microsoft. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Oct 28, 2004 12:12 pm |
|
|
Quote: | SSPBUF = data;
while (!SPI_BF);
data = SSPBUF |
Post the statements where you declare the addresses
of SSPBUF and SPI_BF. Also, if you're using a specific
#opt level, then post that too.
----------------
Trampas: What you (and Mark) suggest is not really realistic.
The main reason that people use CCS (other than price) is the
automatic memory allocation and the numerous built-in functions.
Especially for students, it's too much to ask, to tell them to throw
away all the built-in functions and write their own. They're just
not going to do it. For my own case, I use the functions and they
work 99% of the time. On the other hand, once I find a version
that works well, I stick with it until I have to upgrade, as Sherpa
Doug does. |
|
|
Trampas
Joined: 04 Sep 2004 Posts: 89 Location: NC
|
|
Posted: Thu Oct 28, 2004 4:38 pm |
|
|
PCM Programmer,
What you suggest is sticking with one version of the compiler till you have to upgrade. I know that since 3.1xx I have been trying this approach, but CCS kind of prevents this. For example I updated the PCH compiler which cause a problem where I had to update the PCW compiler, which broke code. Then it was about 4 versions ping ponging, where one version fixed a problem but created another, etc. So basically I spent almost a week trying to get things working again, because of compiler bugs. Needless to say that that cheap price of the compiler cost me a week.
So basically I would say that the CCS intrensic functions are great and make it easy to get started developing code, however you will hit the wall hard usually when you are 95% done with your project. At which point you will spend days debugging only to find a bug in the compiler. So you being a good customer reports the bug and get this nice automatic response. Then you wait for 2 days expecting to get some announcement that they verified the bug and will send you a fix or that it was not reproducable. After the second day you call and say "Hey I NEED a fix" to which they will say "we are looking at it." In the mean time you start debugging the assembly and then email them the problem. At this point your frustration is high and start placing in-line assembly code in your C to fix the bug.
So basically what I am saying is that by not using intrensic functions you will save yourself some time when you get frustrated to no end and give up on CCS and switch to a real C compiler or back to assembly.
Trampas |
|
|
jventerprises
Joined: 01 Apr 2004 Posts: 43 Location: Boston
|
very interesting..... |
Posted: Thu Oct 28, 2004 5:10 pm |
|
|
well, i went collect more data to post here, and when i started the ICD SW i got the dreaded blue screen of death complaining about a driver that went insane. When i booted back up the problem went away...
i can't explain it, and i tried to reproduce it for an hour. I must of had something bad going on with the ICD driver (i updated it to the latest version after that)
if i can get it to happen again, i will post more.
thanks for all your help. _________________ Jon |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Oct 28, 2004 5:16 pm |
|
|
Part of it does seem to be luck. When we started doing a major
project with PCH, we were using vs. 3.187 and 3.188, and they
were stable for us. I think that right around that time, people
were having a lot of problems with versions slightly before that.
I remember thinking "whew ! Were we lucky !". Then I saw
CH Wu's comments on problems and I started feeling worried again.
So without the regression testing or other testing, there is a fair
amount of chance involved. I pity somebody that gets a bad
version as their very first version. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
BIG CAN OF WORMS |
Posted: Fri Oct 29, 2004 7:47 am |
|
|
I know no one wants to here this,....
I know we shouldn't have to do this,...
I know we are the customer and not the vender,...
I know everyone is short on time...
... etc..
BUT ,
Could we, as a group, make a set of regression tests?
or are these done,.. and we just port them to CCS?
Or is this totaly out of our(CCS users group) scope?
--who would maintain?--who would check results?--
..lots of questions... |
|
|
C-H Wu Guest
|
I am pretty happy with 3.212, by now. |
Posted: Fri Oct 29, 2004 9:22 am |
|
|
PCM programmer wrote: |
I remember thinking "whew ! Were we lucky !". Then I saw
CH Wu's comments on problems and I started feeling worried again.
|
PCM programmer:
Which comments are you refering ? My comments changes from time to time. oh, I remembered, the bug_3202_bit_logic.c, a transition from CCS's non-ANSI feature to ANSI right ?
To make it short, 3.187 is pretty good for my application, 3.212 is much better. Other than 3.212, none of the 3.2xx is acceptable. Anything prior than 3.110 should be forget.
The following are my bug test, bug demo programs, that I can contribute to this group,
bug_3025_ftod.c
bug_3123_adff.c
bug_3182_float_add.c
bug_3190_relational.c
bug_3191_delay_us.c
bug_3201_BSR.c
bug_3202_bit_logic.c
bug_3203_BSR_read_adc.c
bug_3203_printf.c
bug_3206_BSR_pointer.c
bug_3207_bit_test_equal.c
bug_3210_MULFF.c
bug_3211_printf.c
Last of all, since we are all on the same boat, its better to work together before jumping into the sea
I believe CCS will be an excellent compiler, and it is pretty good by now.
Best wishes
C-H Wu |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Oct 29, 2004 12:12 pm |
|
|
It was this bug with PCH vs. 3.188:
http://www.ccsinfo.com/forum/viewtopic.php?t=19386&highlight=bsr
Since the bug depended upon the type of code (if-else or switch-case)
it caused me to worry if we would have the same problem. But in
our case it worked OK. So I consider that we were lucky. |
|
|
C-H Wu Guest
|
A tale of my bug hunting days |
Posted: Sat Oct 30, 2004 12:04 am |
|
|
Yes, lots of sweet (? sweating ?) memory associated.
That was the BSR bug, a very serious bug, starting from 3.188_opt_10, all the way up to 3.206. 3.188_opt_9(default) does not have this bug.
At that time, I need #opt 10 to get 12% more programming space. #opt 10 started from 3.187 as a beta and became default since 3.20x, and this BSR bug became a default bug in 3.201 ~ 3.206. By that time, I had 3.188 ~ 3.200 at hand, and all of them have this BSR bug. I was so frustrated, feeling hopeless, and finally, I said, let's give 3.187 a try ... bingo ! 3.187_opt_10 does not have this bug ! ... What a winding road.
It seems that 3.212 is a pretty good version, and it is the version I recommand without hesitation. The free demo is also 3.212d.
BTW, I just got my little 18F4620 yesterday, found two minor bugs in 3.212 associated with this specific chip, found a workaround with only 10 hairs.
Cheers
p.s. am I off topic too far ? |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|