CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

sizeof is wrong?

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
neochrome32



Joined: 09 Jun 2013
Posts: 153

View user's profile Send private message Visit poster's website

sizeof is wrong?
PostPosted: Tue Jun 25, 2013 9:50 pm     Reply with quote

well not sure what happened, was locked?? profanity?

i cant see it.. anyways..


STILL having the problem that the structures are all wrong?

Code:


typedef struct _diskinforec{
   char_t   hJumpCode[3];
   char_t     OEMName[8];
   uint16_t   hBytesPerSector;
   char_t     bSectorsPerCluster;
   uint16_t    Reserved1;
   char_t  FATCopies;
   uint16_t hMaxRootEntries;
   uint16_t hSectors;
   char_t  Descriptor;
   uint16_t holdSectorsPerFat;
   uint16_t hSectorsPerTrack;
   uint16_t hNumberofHeads;
   uint32_t hNumberofHidden;
   uint32_t hNumberofSectors;

   uint32_t hSectorsPerFat;
   uint16_t hFlags;
   uint16_t hFAT32Version;
   uint32_t hRootStartCluster;
} diskinforec;



typedef struct {
   uint32_t MMCAddress;
   uint32_t FATstartidx;
   uint32_t gStartSector;
   uint32_t gFirstDataSector;
   uint16_t gDirEntryIdx;
   uint32_t gDirEntrySector;
   uint16_t gFirstEmptyDirEntry;
   uint32_t gFirstDirEntryCluster;
} FAT32Vars;


typedef struct _direntry{
   char_t  sName[8];
   char_t  spam[3];
   char_t  bAttr;
   char_t  bReserved[8];
   uint16_t   hClusterH;
   uint16_t   hTime;
   uint16_t   hDate;
   uint16_t hCluster;
   uint32_t wSize;
} DIR;

typedef struct {
   char_t    IOpuffer[MMCSD_MAX_BLOCK_SIZE];
   DIR   DirEntry;
   uint32_t CurrentCluster;
   uint16_t posinsector;
   uint32_t position;
   uint32_t dirSector;
   uint16_t dirIdx;
   char_t  mode;
   char_t  Free;
} FILE;


typedef struct  {
   uint16_t      tm_year;
   char_t      tm_mon;
   char_t      tm_day;
   char_t      tm_mday;   
   char_t      tm_hour;   
   char_t      tm_min;     
   char_t      tm_sec;     
} TimeRecord;



TimeRecord myrec; // this variable is updated in regular intervals in DoIdle()

uint32_t FATTable[128];
uint32_t gFirstEmptyCluster;

FAT32Vars gFAT32Vars;
FILE gFiles[MAXFILES];
diskinforec DiskInfo;



#byte gStartSectorL = gFAT32Vars+8
#byte gStartSectorH = gFAT32Vars+9
#byte gStartSectorHL = gFAT32Vars+10

#define END_OF_DIR                  17
#define DIRENTRYS_PER_SECTOR         16
#define CHARACTERS_IN_LONG_FILENAMES   13



im getting the wrong sizes out.

on the 8BIT processor the size of this is 48
on the 16bit, im getting 52, now i understand that this chip is 16bit wide, so the structures are showing up ok

if i do this...
Code:


void MoveToDiscInfo(){
    Diskinfo.hJumpCode[0] = gFiles[MAXFILES-1].IOpuffer[0];
   Diskinfo.hJumpCode[1] = gFiles[MAXFILES-1].IOpuffer[1];
   Diskinfo.hJumpCode[2] = gFiles[MAXFILES-1].IOpuffer[2];
   
   Diskinfo.OEMName[0] = gFiles[MAXFILES-1].IOpuffer[3];
   Diskinfo.OEMName[1] = gFiles[MAXFILES-1].IOpuffer[4];
   Diskinfo.OEMName[2] = gFiles[MAXFILES-1].IOpuffer[5];
   Diskinfo.OEMName[3] = gFiles[MAXFILES-1].IOpuffer[6];
   Diskinfo.OEMName[4] = gFiles[MAXFILES-1].IOpuffer[7];
   Diskinfo.OEMName[5] = gFiles[MAXFILES-1].IOpuffer[8];
   Diskinfo.OEMName[6] = gFiles[MAXFILES-1].IOpuffer[9];
   Diskinfo.OEMName[7] = gFiles[MAXFILES-1].IOpuffer[10];
   
   Diskinfo.hBytesPerSector = make16(gFiles[MAXFILES-1].IOpuffer[12],gFiles[MAXFILES-1].IOpuffer[11]);
   
   
   Diskinfo.bSectorsPerCluster = gFiles[MAXFILES-1].IOpuffer[13];
   Diskinfo.Reserved1           = make16(gFiles[MAXFILES-1].IOpuffer[15],gFiles[MAXFILES-1].IOpuffer[14]);
   Diskinfo.FATCopies          = gFiles[MAXFILES-1].IOpuffer[16];
   Diskinfo.hMaxRootEntries    = make16(gFiles[MAXFILES-1].IOpuffer[18],gFiles[MAXFILES-1].IOpuffer[17]);
   Diskinfo.hSectors          = make16(gFiles[MAXFILES-1].IOpuffer[20],gFiles[MAXFILES-1].IOpuffer[19]);
   Diskinfo.Descriptor          = gFiles[MAXFILES-1].IOpuffer[21];
   Diskinfo.holdSectorsPerFat = make16(gFiles[MAXFILES-1].IOpuffer[23],gFiles[MAXFILES-1].IOpuffer[22]);
   Diskinfo.hSectorsPerTrack    = make16(gFiles[MAXFILES-1].IOpuffer[25],gFiles[MAXFILES-1].IOpuffer[24]);
   Diskinfo.hNumberofHeads    = make16(gFiles[MAXFILES-1].IOpuffer[27],gFiles[MAXFILES-1].IOpuffer[26]);
   Diskinfo.hNumberofHidden    = make32(gFiles[MAXFILES-1].IOpuffer[31], gFiles[MAXFILES-1].IOpuffer[30], gFiles[MAXFILES-1].IOpuffer[29], gFiles[MAXFILES-1].IOpuffer[28]);
   Diskinfo.hNumberofSectors    = make32(gFiles[MAXFILES-1].IOpuffer[35], gFiles[MAXFILES-1].IOpuffer[34], gFiles[MAXFILES-1].IOpuffer[33], gFiles[MAXFILES-1].IOpuffer[32]);

   Diskinfo.hSectorsPerFat    = make32(gFiles[MAXFILES-1].IOpuffer[39], gFiles[MAXFILES-1].IOpuffer[38], gFiles[MAXFILES-1].IOpuffer[37], gFiles[MAXFILES-1].IOpuffer[36]);
   Diskinfo.hFlags             = make16(gFiles[MAXFILES-1].IOpuffer[41],gFiles[MAXFILES-1].IOpuffer[40]);
   Diskinfo.hFAT32Version       = make16(gFiles[MAXFILES-1].IOpuffer[43],gFiles[MAXFILES-1].IOpuffer[42]);
   Diskinfo.hRootStartCluster = make32(gFiles[MAXFILES-1].IOpuffer[47], gFiles[MAXFILES-1].IOpuffer[46], gFiles[MAXFILES-1].IOpuffer[45], gFiles[MAXFILES-1].IOpuffer[44]);
}


its a shocking way of doing this, but this puts the data in the right place

the code
memcpy(&diskinfo, gFiles[MAXFILES-1].IOPuffer,sizeof(diskinfo));

it mismatches, and i cant figure out why...

id rather use memcpy ..

-- to the moderator -- last topic was locked? but not sure where the profanity was, i meant no disrespect here :(
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Tue Jun 25, 2013 11:56 pm     Reply with quote

The problem is in the definition of the structure diskinforec (DOS FAT BPB), it can't work with PIC24,
or more generally with any processor that requires words aligned to even memory addresses. The compiler will insert
fill bytes to enforce correct alignment of words, unfortunately breaking the integrity of the BPB structure. You would
know if you ever looked into the assembly code.

Many C compilers have a feature to define a structure like the FAT BPB with a packed attribute which allows
to align words at odd addresses. But then, a direct word access would cause an address error trap. So in
any case, some special handling is required.

Technically, it's best to replace the definition of misaligned words by an uint8[2] type.
An access it through a _copyword() macro.
Ttelmah



Joined: 11 Mar 2010
Posts: 19350

View user's profile Send private message

PostPosted: Wed Jun 26, 2013 12:45 am     Reply with quote

On the 'locking', some of the variable names you were (are still in one case) using, have got picked up by the filtering. Sometimes it is 'thick', and sees 'rude words' in things that are perfectly normal....
Note the variable names replaced by '[spam]' in the original post.

On the problem it is one of those things where working with the 'bigger' PIC's gets harder. Normally for stuff used internally it is not a problem, with the compiler just inserting extra alignment bytes, but where you want to force a particular alignment, to work in the outside world, it can get very annoying.

I've in the past just setup a single 'byte' array the size wanted, and used #define to give names to the data locations, copying these as needed to local variables.

Bes Wishes
neochrome32



Joined: 09 Jun 2013
Posts: 153

View user's profile Send private message Visit poster's website

PostPosted: Wed Jun 26, 2013 7:54 am     Reply with quote

Thanks guys, i thought this was going off,
My Assembly isn't great so i didn't notice that problem...

it sort of pads out the structs...

time to rethink i think,

i got FAT to read and clusters ok enough now... but it still won't work on the writing/creating of files...

thanks again Smile
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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