|
|
View previous topic :: View next topic |
Author |
Message |
dc
Joined: 01 Jun 2012 Posts: 2
|
Very simple for loop problem |
Posted: Fri Jun 01, 2012 1:18 am |
|
|
Hi,
I have a code that stores bits of a byte in a bit array. I will not post all the code, I think it is not necessary. But instead I am going to post working and not working versions.
WORKING *******************************************
TX_BUFFER[ 0] = BIT_TEST(TX_BYTES[0],0);
TX_BUFFER[ 1] = BIT_TEST(TX_BYTES[0],1);
TX_BUFFER[ 2] = BIT_TEST(TX_BYTES[0],2);
TX_BUFFER[ 3] = BIT_TEST(TX_BYTES[0],3);
TX_BUFFER[ 4] = BIT_TEST(TX_BYTES[0],4);
TX_BUFFER[ 5] = BIT_TEST(TX_BYTES[0],5);
TX_BUFFER[ 6] = BIT_TEST(TX_BYTES[0],6);
TX_BUFFER[ 7] = BIT_TEST(TX_BYTES[0],7);
NOT WORKING ****************************************
FOR ( CNT = 0; CNT<=7; CNT++ )
TX_BUFFER[CNT] = BIT_TEST(TX_BYTES[0],CNT);
Does any one understand why? My version is 4.068.
Regards,
dc |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Fri Jun 01, 2012 1:49 am |
|
|
How is TX_BUFFER declared?.
Realistically, 4.068, is 'borderline' for working as a compiler.
However, 'what fails'?. I just put a simple program around this, and tested in 4.070, the oldest V4 compiler I have kept, and both work fine.
Code: |
void main(void) {
int8 tx_buffer[8];
int8 tx_bytes[1];
int8 cnt;
tx_bytes[0]=0xAA;
TX_BUFFER[ 0] = BIT_TEST(TX_BYTES[0],0);
TX_BUFFER[ 1] = BIT_TEST(TX_BYTES[0],1);
TX_BUFFER[ 2] = BIT_TEST(TX_BYTES[0],2);
TX_BUFFER[ 3] = BIT_TEST(TX_BYTES[0],3);
TX_BUFFER[ 4] = BIT_TEST(TX_BYTES[0],4);
TX_BUFFER[ 5] = BIT_TEST(TX_BYTES[0],5);
TX_BUFFER[ 6] = BIT_TEST(TX_BYTES[0],6);
TX_BUFFER[ 7] = BIT_TEST(TX_BYTES[0],7);
delay_us(1); //Stop here and look at tx_buffer 0,1,0,1 etc...
tx_bytes[0]=0x55;
FOR ( cnt= 0; cnt<=7; cnt++ )
TX_BUFFER[cnt] = BIT_TEST(TX_BYTES[0],cnt);
delay_us(1); //Then look here, and it is 1,0,1,0 etc..
do {
} while(TRUE);
}
|
So, how is your version 'not working'. One thing the loop version will take a lot longer. The individual bit tests, directly feeding to fixed addresses in the RAM, code as 4 instructions each. Using the counter, the array has to be accessed, and the bits have to be located by rotation, taking a minimum of 14 instructions, rising to nearly 50 instructions for the highest bits. Average about 34 instructions. Over 8* slower. If you are using this code for some form of serial output, the timing might cause a problem.
Best Wishes |
|
|
dc
Joined: 01 Jun 2012 Posts: 2
|
|
Posted: Fri Jun 01, 2012 2:13 am |
|
|
Hi,
TX_BUFFER is declared as bit array.
*********************
INT1 TX_BUFFER[96];
*********************
But I did not get reason for declaring 8 bit array for a bit. Actually this way will take more time in actual time critic part, since I must get a bit from a byte in order to send bits.
instead of using this
output_bit(TX_PIN,TX_BUFFER[x]);
you will have to use this right?
output_bit(TX_PIN,bit_test(TX_BUFFER[x],0));
If you try it like I did is your code works?
Regards,
dc |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Fri Jun 01, 2012 3:05 am |
|
|
Read the manual. Bit arrays are not legal.
That it is working at all, is 'luck'.
Best Wishes |
|
|
Geps
Joined: 05 Jul 2010 Posts: 129
|
|
Posted: Fri Jun 01, 2012 3:16 am |
|
|
Ttelmah,
You can now use bit arrays but as the OP is finding operations with them are very buggy.
I've written functions that use bit arrays, released the code, and two revisions (of my code - not the compiler) when I've added functionality to separate parts of the firmware the functions no longer work. Conversion over to int8 has solved the problem or even in some case just casting to int8.
I just refuse to use int1 for the time being - all new code is int8 upwards. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Fri Jun 01, 2012 3:54 am |
|
|
Not with 4.068.
I agree that with the latest compilers these are nominally available, but the poster has 4.068. Bit arrays at that time are specifically listed as 'not supported', and basically did not work at all.
Best Wishes |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Fri Jun 01, 2012 12:23 pm |
|
|
the part that makes no sense to me is:
Code: |
TX_BUFFER[ 0] = BIT_TEST(TX_BYTES[0],0);
|
since i have trouble understanding the usefulness of it, assuming that
TX_buffer might be used for BYTE transmission.
cuz if so, all you will ever transmit is ASCII 0 or 1.
if the result is meant for terminal display
mapping the bit test result to Bit_test() +48;
gives a much more friendly result, IMHO |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Fri Jun 01, 2012 2:46 pm |
|
|
I also have to point out, that if you are using bits in a byte, the entire transfer could be down by just transferring the byte contents of TX_BYTES[0], to the byte holding the bits of TX_BUFFER. Single byte move.....
Best Wishes |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Tue Jun 12, 2012 1:54 pm |
|
|
revisiting illegal bit arrays.
using 4.132
I just converted a sloppy old int1 virtual array technique to:
and yee compiler is quite happy and accurate with subsequent direct access
as in
Code: |
if (hits[7]) {hits[7]=0;}
else if (0==hits[i]) {hits[i]=1;}
|
I had believed this was supposed to be illegal but at least for simple int1 arrays of modest dimension I can attest that it definitely works now.
The .LST file agrees. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19513
|
|
Posted: Wed Jun 13, 2012 1:14 am |
|
|
Yes, I think it started working in the low 4.100's. There are still a few problems if you put them into structures, but they are now 99% working.
But as I said, not in 4.068....
Best Wishes |
|
|
|
|
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
|