CodeVision ตอนที่ 2
Comments 
เหมือนกันกับภาษาซี CodeVision ก็มีรูปแบบการเขียนคอมเมนท์ หรือ หมายเหตุ ของโปรแกรม เพื่อเอาไว้เขียนคำอธิบายโปรแกรม หรือสิ่งที่เราต้องการสื่อสารให้ผู้ที่มาอ่านโค๊ดของเราในภายหลัง หรือเอาไว้ให้เราอ่านเอง แต่ไม่ต้องการให้ Complier หรือตัวแปรภาษาโปรแกรม สนใจในส่วนนี้ เรามีรูปแบบการเขียน Comment สองรูปแบบคือ 

รูปแบบที่ 1 /*  This is comment    */  
   หรือ 
  /* This is comment
     This is comment
     This is comment  */
สามารถที่จะเขียนคอมเมนต์ หรือหมายเหตุ บรรทัดเดียว หรือหลายบรรทัดก็ได้

และ รูปแ่บบที่ 2  // This is comment
รูปแบบนี้ เขียนได้เพียงบรรทัดเดียว 


Reversed Keywords หรือคำสงวน 
คำสงวนพวกนี้ เป็๋นคำที่เป็นคำสั่งพิเศษ ที่โปรแกรมต้องการใช้ ห้ามให้เรานำคำเหล่านี้ ไปตั้งเป็นชื่อตัวแปร ซึ่งเราจะได้พบเห็นในตอนต่อๆ ไป คำสงวนเหล่านี้ ได้แก่ 

__eeprom            enum            static
__flash                extern           struct
__interrupt          flash             switch 
__task                 float               typedef
_bool                  for                 union
break                  goto              unsigned
bit                       if                   void
bool                    inline             volatile
case                   int                  while
char                    interrupt
const                  long
continue              register
default                return
defined               short
do                      signed
double                sizeof
eeprom               sfrb
else                    sfrw


Identifiers
ในการตั้งชื่อตัวแปร ตัวใหญ่ กับตัวเล็ก ให้ความหมายที่ต่างกัน เราสามารถที่จะตั้งชื่อตัวแปรขึ้นต้นด้วย ตัวอักษา A...Z หรือ a.....z หรือใช้ตัว __ เครื่องหมาย underscore ในการนำหน้าชื่อตัวแปร ก็ได้

Data Types
ชนิดของข้อมูลแต่ละประเภท ใช้จำนวนหน่วยความจำที่แตกต่างกัน และให้ขอบเขตของค่าข้อมูลที่แตกต่างกันดังตารางด้านล่างนี้ 

 Type Size(Bits)   Range
bit  0, 1 
 bool, _Bool 0, 1
 char -128 to 127 
 unsigned char 0 to 255 
 signed char -128 to 127 
 int 16  -32768 to 32767 
 unsigned int 16  0 to 65535 
 signed int  16  -32768 to 32767 
 long int 32  -2147483648 to 2147483647 
 unsigned long int 32  0 to 4294967295 
 signed long int 32  -2147483648 to 2147483647  
 float 32  +/- 1.175e-38 to +/-3.402e38 
 double 32  +/- 1.175e-38 to +/-3.402e38 

Constants 
ค่าคงที่ เป็นค่าที่เราประกาศแล้ว  เป็นตัวเลขอาจจะเขียนอยู่ในรูปเลขฐานสิบ (เช่น 1234) 
ถ้าต้องการเขียนให้อยู่ในรูปเลขฐานสอง เราจะเขียนได้เป็น 0b นำหน้าเลขฐานสอง เช่น 0b101001 
ในเลขฐานสิบหก เราจะให้ 0x นำหน้าตัวเลขฐานสิบหก เช่น 0xff 
หรือ ถ้าเป็นเลขฐานแปด เราจะใช้ 0 นำหน้า เช่น 077 

ถ้าเราต้องการบอกให้ complier ทราบว่าเลขต่อไปนี้ เป็นข้อมูลชนิด unsigned integer เราอาจจะใส่ U ตามหลังเลข เช่น 1000U
ถ้าเป็นข้อมูลที่เป็น Long integer เราจะใช้ L ตามหลังตัวเลข เช่น 99L
สำหรับข้อมูลที่เป็น Unsigned long integer เราจะใช้ผสมกันระหว่าง U และ L เช่น 99UL
จำนวนที่เป็นเลขทศนิยม Floating point เราจะใช้ F ตามหลังเลขทศนิยม เช่น 1.234F
ค่าคงที่ ที่เป็นตัวอักขระ เราจะใช้เครื่องหมาย single quote เช่น 'a'
แต่ถ้าเป็นค่าคงที่ ทีเป็นข้อความ หรือ string เราจะใช้ double quote เช่น "Hello World"

เราสามารถประกาศตัวแปร constant ได้ทั่ง Global (เห็นทุกฟังก์ชัน) หรือแบบ Local (เห็นเฉพาะ ในฟังก์ชันที่ประกาศ) โดยใช้คำว่า cost นำหน้า ตัวแปรที่เราประกาศ ดูตัวอย่าง

/* Global constants declaration */
const char char_constant = 'a';
const int b=1234+5;
const long long_int_constant1 = 99L;
const long long_int_constant2 = 0x1000000;
const float pi = 3.14;

void main(void) {
    /* Local constant declaration */
    const long f = 2222222;
    const float x = 1.5;

}

นอกจากนี้ เราสามารถประกาศตัวแปรค่าคงที่ ที่เป็น array ได้ด้วย โดยที่ index ตัวเลขมีลำดับเป็น 0  เช่น 
const char string_constant2[] = "This is a string constant";
const int abc[3] = {1,2,3};

แต่ถ้าเราประกาศแบบนี้ จะทำให้ 2 ลำดับแรก มีค่าเป็น 1 และ 2 ลำดับที่เหลือ จะกลายเป็นเลขศูนย์ทั้งหมด
const int integer_array2[10] = {1,2};

หรือจะสร้างเป็น array หลายมิติก็ได้ 
const int multidim_array[2][3] = {{1,2,3},{4,5,6}};

ถ้าหากโปรแกรม CodeVision ถูกกำหนดที่เมนู Project|Configuration|C Complier|Code Generator|Store Global| Constant in FLASH Memory ถูกกำหนดเป็น  Enable แล้ว ต้ัวแปร global constant เมื่อถูกประกาศแล้ว (มีคำว่า const หน้าตัวแปร) จะถูกเก็บไว้ที่ FLASH Memory เมื่อถูกคอมไำพล์ แต่ถ้าที่เมนู ถูกกำหนดไว้เป็น disabled ตัวแปรที่ประกาศเป็น const จะถูกเก็บไ้ว้ที่ RAM memory และตัวแปรที่เป็น Local constant จะถูกเก็บไว้ที่ RAM memory.



คำว่า flash หรือ _flash เมื่อนำมาใช้ในการประกาศตัวแปรที่เป็นค่าคงที จะเป็นการนำค่าของตัวแปรนั้นไปเก็บไว้ที่ FLASH memory ไม่ว่าเราจะไปตั้งค่าที่ Store Global Constant in FLASH memory หรือไม่ก็ตาม
 
 

รูปแบบ 
flash <type definition> <identifier> = constant expression;
_flash <type definition> <identifier> = constant expression;

ตัวอย่าง 

flash int integer_constant = 1234+5;
flash char char_constant = 'a';
flash long long_int_constant1 = 99L;
flash long long_int_constant2 = 0x1000000;
flash int integer_array1[] = {1,2,3};
flash char string_constant1[] = "This is a string constant located in FLASH";

ในกรณีที่เราต้องส่งค่าที่เป็น string เข้าไปในฟังก์ชัน เราจะต้องส่งค่าแบบ pointer เท่านั้น ในการส่งค่าเข้าไปนี้ เราสามารถที่จะสั่งให้ทำการเก็บค่าตัวแปรที่ส่งเข้าไปไว้ที่ memory โดยใช้ keyword constant ที่เราได้กล่าวไว้แล้วได้ ตัวอย่างการนำไปใช้งาน และประสิทธิภาพ 

/* This function displays a string located in RAM. */
void display_ram(char *s){

}

/* This function displays a string located in FLASH. */
void display_ram(flash char *s){

}


/* This function displays a string located in EEPROM. */
void display_ram(eeprom char *s){

}

void main(void) {
/* ข้อความ "Hello world" จะถูกเก็บไว้ที่ FLASH memory โดย complier 
   แล้วจะทำการ copy ไปไว้ที่ส่วนเริ่มต้นของโปรแกรม นั่นคือ RAM เำื่พื่อให้
   ตัวแปร pointer เข้ามาใช้งานได้ เพื่อนำเข้าข้อมูลส่งเข้าไปใน function 
   โค๊ดตัวอย่างนี้ ให้ประสิทธิภาพของโปรแกรมค่อนข้างต่ำ เพราะว่า FLASH และ
   RAM memory ถูกนำไปใช้ทั้งคู่ */
display_ram("Hello world");

/* ข้อความ "Hello world" จะถูกเก็บไว้ที่ FLASH memory เท่านั้น 
   เป็นตัวอย่างการเขียนโปรแกรมที่ดี โค๊ดมีประสิทธิภาพดี */
display_flash("Hello world");

/* ข้อความ "Hello world" จะถูกเก็บไว้ที่ EEPROM memory เท่ีานั้น.
   โค๊ดมีประสิทธิภาพมากที่สุด เพราะ FLASH memory ไม่ได้ถูกนำมาใช้เพื่อการนี้เลย */
display_eeprom("Hello world");

while (1);
}
  
Comments