GPIO STM32F1

Started by tha, September 08, 2020, 08:42:55 AM

Previous topic - Next topic

tha


tha

โปรแกรมย่อย Delay uS ของ HAL ดูแล้วไม่มี
ของโปรแกรม Keil จะเป็นแบบนี้
Quote
   void DelayuS(vu32 nCount)
        { 
           while (nCount--);
         }
โปรแกรม Systme Workbench for STM32 มันคอมไพล์ไม่ผ่าน ผมเลยเปลี่ยนมาเป็นแบบนี้
Quote
        void DelayuS(volatile unsigned long nCount)
   {
     while (nCount--);
   }
vu32 = volatile unsigned long ถูกต้องไหม แต่โปรแกรมก็ทำงานได้นะครับ
volatile หมายถึงอะไร ผมก็ลืมแล้ว ท่านใดทราบ ช่วยอธิบายด้วยครับ

tha



dec

volatile เป็นการนิยามว่า memory หรือตัวแปรส่วนนี้มีความแปรปรวนครับ
จะมีผลก็ต่อเมื่อเราเปิด optimizer ครับ compiler จะไม่ optimize ตัวแปรหรือ memory ที่เป็น volatile
จะจัดการอย่างตรงไปตรงมา

โดยปกติ compiler จะมองว่า memory หรือตัวแปรจะเปลี่ยนค่าก็ต่อเมื่อถูกเซ็ตค่า

เช่น
a = 1;

แต่ compiler จะพิจารณาแค่ไฟล์ต่อไฟล์เท่านั้น เช่น

ในไฟล์ main.c มีการประกาศตัวแปร global
int a = 1;

แล้วก็มีการใช้งาน
while(a);

แต่ไม่มีการเปลี่ยนค่า a ใน main.c อีก

ส่วนในไฟล์ interrupt.c มีการเปลี่ยนค่าตัวแปร a
a = 0;

ถ้าเราเปิด optimizer ขณะที่ compiler ทำการ compile ไฟล์ main.c compiler ก็จะมองแค่ไฟล์ main.c ไฟล์เดียว
ไม่ได้สนใจว่า interrupt.c จะมี code อะไร ทำให้ compile เข้าใจว่า a มีค่าเป็น 1 แล้วก็ไม่มีการเปลี่ยนค่าอีก
compiler เลยทำการแทนที่ a ใน code main.c ด้วยค่า 1 เลยทั้งหมด แม้โปรแกรมจะทำงานมาถึงไฟล์ interrupt.c
และเปลี่ยนค่าตัวแปร a ไป ก็ไม่สามารถทำให้หลุดจาก while ได้

อีกกรณีก็พวก register ที่จะถูกเซ็ตค่าโดย hardware ตอน compile ตัว compiler จะมองว่ามันเป็นแค่
memory ตำแหน่งหนึ่ง แล้วก็มีการอ่านค่ามาอย่างเดียว ไม่มีการเซ็ตค่า ก็เสี่ยงที่จะถูก optimize ได้
เราจึงมักจะนิยาม register ให้เป็น volatile เพื่อป้องกันไม่ให้ compiler optimize ครับ

ส่วนใน function delay นั่น ถ้าตัวแปร nCount ไม่ใช่ volatile optimizer มันจะมองว่า while มันเป็น loop เปล่าๆ
และ nCount หลังจากหลุด while ไปแล้วมันก็ไม่ได้ใช้งานอะไร มันจะลบ loop ทิ้งเอาดื้อๆ เพราะมองว่ามันเสียเวลาโดยเปล่าประโยชน์
แต่ถ้า nCount เป็นตัวแปร volatile มันก็จะตัด loop ออกไม่ได้ เพราะ compiler จะไม่ optimize แต่แปร nCount และตัวแปร nCount
ต้องถูกนับลดและอ่านค่าอย่างตรงไปตรงมา ทำให้ loop ยังอยู่ครับ

tha


tha


tha


tha