To say something on console

From ThaiEasyElecWiki
Jump to: navigation, search

It's useful to print something on console so you know which functions are executed, which state your firmware is running or what variables' value is in runtime. Functions from console.c below can be used:

unsigned char say(void); //say it now!!!
void saych(char c); //say a character
void saystr(char *str); //say a word
void sayhex(unsigned char hex); //say a 8-bit data in hex format
void sayhex16(unsigned short hex); //say a 16-bit data in hex format
void sayhex32(unsigned long hex); //say a 32-bit data in hex format

Using saych, saystr, sayhex, sayhex16 and sayhex32 won't print out data instantly. Instead, ASCII code to be printed out will be stored in a buffer to print out later when say is executed in the forever loop (say is called in while(1) in main function). This mechanism save a lot of time since serial communication speed is slow compared with the CPU speed. There are 16-byte FIFO in serial module so we can put 16 outgoing bytes in no time and the CPU can process other tasks while the serial module is sending data.

However, function say returns 1 when there are more data to say so if it's needed to print out messages instantly, you can use:

while(say());

after sayxxx. Doing this is helpful when the message to print out is very long and the buffer size is small. It also helps when your firmware halts later and you can't see what it's going to say.

Furthermore, in case that you want to print out some integer value or some complex messages with variables inside, use sprintf and saystr. But here you will need to allocate some memory first. For example:

	char str[10]; //it's very important to provide enough size
	int x = 12345;
	sprintf(str,"%d",x);
	saystr(str);
===============================================================

เราสามารถใช้การส่งข้อมูลออกมาทาง console ในการพัฒนา firmware เช่นใช้ตวจสอบว่าฟังก์ชั่นใดที่ถูกใช้งานบ้าง กำลังทำงานที่สถานะไหน หรืออาจจะใช้ตรวจสอบค่าของตัวแปรต่างๆ ฟังก์ชั่นที่ใช้ในการส่งข้อมูลในรูปแบบต่างๆ อยู่ในไฟล์ console.c ดังนี้

unsigned char say(void); //say it now!!!
void saych(char c); //say a character
void saystr(char *str); //say a word
void sayhex(unsigned char hex); //say a 8-bit data in hex format
void sayhex16(unsigned short hex); //say a 16-bit data in hex format
void sayhex32(unsigned long hex); //say a 32-bit data in hex format

การใช้ฟังก์ชั่น saych, saystr, sayhex, sayhex16 และ sayhex32 จะไม่ส่งข้อมูลออกมาทันที แต่จะเก็บรหัส ASCII ของข้อมูลที่จะส่งไว้ใน buffer และจะถูกส่งออกมาภายหลังเมื่อ firmware กลับมาทำงานใน while(1) ซึ่งอยู่ในฟังก์ชั่น main ใน main.c ด้วยฟังก์ชั่น say วิธีการส่งแบบนี้ช่วยให้ CPU ไม่ต้องรอการส่งข้อมูลทาง serial port ซึ่งช้ากว่าความเร็วของ CPU มาก และเนื่องจากโมดูล serial มี FIFO ขนาด 16 ไบต์ ดังนั้น CPU สามารถส่งข้อมูลออกมาทาง serial ครั้งละ 16 ไบต์ (ในเวลาที่สั้นมาก) แล้วไปทำงานอย่างอื่นได้โดยที่ไม่ต้องรอ จนกระทั่งเมื่อกลับมาตรวจสอบอีกครั้งแล้วพบว่าข้อมูลใน FIFO ว่างแล้ว จึงทยอยส่งข้อมูลที่ยังค้างอยู่ออกมาอีก

อย่างไรก็ตาม หากต้องการส่งข้อมูลออกมาทาง console ทันที ให้ใช้

while(say());

หลังจากข้อมูลถูกเก็บใน buffer แล้ว ด้วยฟังก์ชั่น sayxxx ทั้งนี้ ฟังก์ชั่น say จะส่งคืนค่า 1 เมื่อยังพบว่ามีข้อมูลค้างอยู่ใน buffer อีก แม้การทำงานแบบนี้ จะทำให้ CPU ต้องเสียเวลารอส่งข้อมูล แต่ก็มีข้อดีคือสามารถจะส่งข้อมูลยาวๆออกมาได้ทันที ในกรณีที่ buffer มีขนาดเล็ก (ถ้ามีการเก็บข้อมูลลง buffer เกินขนาดของ buffer ข้อมูลที่เกินจะหายไป) หรือในกรณีที่ firmware ค้างก่อนที่จะทยอยส่งข้อมูลออกมาได้หมด ก็จะช่วยให้เห็นข้อมูลที่ต้องการส่งออกมาได้

นอกจากนี้ ถ้าต้องการส่งข้อมูลเป็นตัวเลขฐานสิบ หรือส่งข้อมูลเป็นข้อความที่ซับซ้อน และมีค่าตัวแปรต่างๆถูกส่งออกมาด้วย สามารถใช้ sprintf ร่วมกับ saystr แต่จะต้องประกาศตัวแปร array เพื่อจัดเรียงข้อความก่อน ดังตัวอย่าง

	char str[10]; //it's very important to provide enough size
	int x = 12345;
	sprintf(str,"%d",x);
	saystr(str);
Personal tools
Namespaces
Variants
Actions
Navigation
Articles and Tutorials
Shortcut (mini SUN7)
Toolbox