|
|
View previous topic :: View next topic |
Author |
Message |
Guest
|
Inter-SEGMENT Transition Issue, or STACK overflow? |
Posted: Mon Jan 25, 2010 4:44 am |
|
|
I am working in a project with a 16F876A.
The project is taking a 46% of the ROM (3.68KB out of 8KB).
The thing is that when a new function is added, the program stops working as it should.
This miss-behavior cannot be blamed on the new funcionallity. To be more concise: This new function is outside the “infinite loop” of the program, is a display presentation that is only executed once, and works nice.
After that, the infinite loop is entered and it is there where the behavior goes erratic and garbled.
I thought it had to be with some inter-SEGMENT transition, or some piece of code too large to be located in one segment.
I went through the output files of the compiler to look for something suspicious, but I didn’t.
MAIN = 22% ROM
1 unused SEGMENT
The rest of funcions range from 1% to 14% (mostly 1 to 6%)
In case is of some help to any kind of genius, this is a comparison between the two compilations, first with the added function and second without it:
Code: |
WITH ADDED FUNCTION WITHOUT NEW FUNCTION
------------------- --------------------
Segment Used Free Segment Used Free
----------- ---- ---- ----------- ---- ----
00000-00003 4 0 00000-00003 4 0
00004-00039 54 0 00004-00039 54 0
0003A-007FF 1985 5 0003A-007FF 1936 54
00800-00FFF 1420 628 00800-00FFF 1637 411
01000-017FF 926 1122 01000-017FF 0 2048
01800-01EFF 0 1792 01800-01EFF 0 1792 |
I also tried to add a #SEPARATE directive above each function in order to prevent the linker from doing INLINEs, but the result keeps being the same.
I also thought about some stack overflow issue, but the CALL TREE states that only 7 levels are used:
7 worst case (6 in main + 1 for interrupts)
I keep thinking that some of these are the root of the problem, but I can’t think a way to find it out.
Please, some advice on this?
COMPILER VERSION: CCS PCM C Compiler, Version 4.068, 11166 |
|
|
Ttelmah Guest
|
|
Posted: Mon Jan 25, 2010 4:58 am |
|
|
I'd be looking at the possibility of a _RAM_ problem. What you describe,is 'semi-classic', for something using a pointer/array, and overwriting a variable, that it shouldn't touch, which then results in the part of the program that does use that variable, receiving unexpected values....
Classic things would be 'forgetting' that a string needs space for the terminating character, and only assiging 10 locations for a 10 character string, resulting in the next variable getting overwritten.
Best Wishes |
|
|
Guest
|
|
Posted: Mon Jan 25, 2010 6:04 am |
|
|
Yes, you are right, that could be happening.
Nevertheless the new function is not adding more than 14 variables.
Code: | RAM used: 140 (39%) at main() level
198 (55%) worst case |
Of course it could also be a dormant error that has arises when this function has been added. Nothing to do with amount of RAM available.
Anyway, I would like to have any argument to discard the possibility of the SEGMENT issue or the STACK. I don’t know if the information provided by the .STA file is reliable enough to forget about the matter, or on the contrary, some other precautions and checks have to be done. |
|
|
|
|
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
|