![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
TimothyCarter
Joined: 08 Aug 2016 Posts: 22
|
WORD keyword variable types |
Posted: Thu May 20, 2021 10:31 am |
|
|
NOTE see below for a couple of warnings about using WORD, and unions... use the following code at your own risk!
Just because I like using keywords such as WORD, DWORD and thought there just might be someone else that would like to as well:
I am not aware of any CCS libraries that do this, but it also comes in handy to access individual bytes/bits of variables.
It is HIGHLY recommended to use your own names for the unions, as the use of WORD, etc have been deprecated (see comment from Ttelmah below).
Also, I usually turn on case sensitivity (see the #case keyword).
Code: |
/**************************************
* File: var_def.h
*
* Description: Contains union defines
* for accessing individual bits
* of different size variables.
*
* Must define max bit depth of
* the processor used!
*
*************************************/
#ifndef _VAR_DEF_H
#define _VAR_DEF_H
// Need to have the stdint.h file for typedef's
#include <stdint.h>
#include <stdbool.h>
typedef union
{
uint8_t Val;
bool b[8];
} BYTE;
typedef union
{
uint16_t Val;
uint8_t B[2];
bool b[16];
} WORD;
typedef union
{
uint32_t Val;
uint16_t W[2];
uint8_t B[4];
bool b[32];
} DWORD;
typedef unsigned long word_t;
typedef unsigned int32 dWord_t;
typedef union
{
dWord_t val;
float fVal;
word_t w[2];
uint8_t b[4];
} FLOAT_VAL;
#if defined(__PCD__)
typedef union
{
uint64_t Val;
uint32_t D[2];
uint16_t W[4];
uint8_t B[8];
bool b[64];
} QWORD;
#endif
#endif // End of _VAR_DEF_H
|
_________________ “Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter.”
- Eric S. Raymond
Last edited by TimothyCarter on Tue Apr 12, 2022 3:26 pm; edited 6 times in total |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19369
|
|
Posted: Mon May 24, 2021 6:22 am |
|
|
It is a dangerous form to use.
Much better to always be explicit and use the forms like int16 etc..
Problem is that 'WORD' means a lot of different things. In Windows API's
they use 'word' for 16bits, which comes from the original 8086 (and in a
strange way the 8088 - which though an '8bit' CPU, used a 16bit WORD
size). However in processing, word is defined as:
Quote: |
A WORD is the amount of data that a machine can process at one time. This fits into the document analogy that includes characters (usually eight bits) and pages (many words, often 4 or 8KB worth) as other measurements of data. A word is an integer number of bytes for example, one, two, four, or eight. When someone talks about the "n-bits" of a machine, they are generally talking about the machine's WORD size. For example, when people say the Pentium is a 32-bit chip, they are referring to its WORD size, which is 32 bits, or four bytes.
|
On the PIC16/18, a 'WORD' is actually 8bits, not 16bits.
In fact in some ways the PIC24's are 24bit WORD size chips. Using a 24bit
'instruction WORD', but still using a 16bit data WORD size.
For this reason, WORD though it existed in the early ANSI compilers was
removed from later releases, with the comment that it 'should not be used'.
You are 'making things harder for future compatibility....
Also BYTE is already a defined type. |
|
![](templates/subSilver/images/spacer.gif) |
TimothyCarter
Joined: 08 Aug 2016 Posts: 22
|
Old Code Examples |
Posted: Tue Jun 22, 2021 11:07 am |
|
|
The above code is the result of using multiple compilers and trying to access the individual bytes in the 16, 32, and 64 bit variables: I realize CCS has things like make8, make16, etc - but like I say when switching between CCS and XC compilers, it gets confusing.
Since posting the above, I have also found out that unions should not be used for many of the same reasons you point out.
So, there needs to be a BIG disclaimer in the code ![Wink](images/smiles/icon_wink.gif) _________________ “Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter.”
- Eric S. Raymond |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|