stm32 mp3

Started by tha, June 17, 2014, 12:33:26 PM

Previous topic - Next topic

tha

ขอบคุณที่ชี้แนะ ผมลองประกาศฟังชั่น delay_ms โดยไม่มี static นำหน้า http://www.electoday.com/index.php/topic,11822.0.html แล้วใช้ delay_ms ในไฟล์ main.c แต่มันจะไม่ดีเลย์ตามที่เราตั้งเลย

        LCD_DisplayStringLine(Line5,"File read success",White,Blue);
    delay_ms(4000);
    LCD_DisplayStringLine(Line5,"File read failure",White,Red);
    delay_ms(4000);

ผมลองใส่ volatile หน้า variable เพื่อให้ c compiler ไม่ optimized code แล้วก็ยังไม่ได้(ท่านใดทราบรายละเอียดของ volatile โปรดชี้แนะ)
void delay_ms(volatile uint32_t ms)
{
volatile uint32_t len;
    for (;ms > 0; ms --)
        for (len = 0; len < 100; len++ );
}


ลองใส่อย่างนี้ในไฟล์ main.c ก็ไม่ดีเลย์ครับ
/* Includes ------------------------------------------------------------------*/
#include "GLCD_R61505U.h"

static void delay_ms1(volatile uint32_t ms)
{
volatile uint32_t len;
    for (;ms > 0; ms --)
        for (len = 0; len < 100; len++ );
}

int main(void)
{
display_init();
spi_enable();
lcd_reset();
lcd_clear(Black);

    while(1)
    {
    LCD_DisplayStringLine(Line5,"File read success",White,Blue);
    delay_ms1(4000);
    LCD_DisplayStringLine(Line5,"File read failure",White,Red);
    delay_ms1(4000);
    }
}


เป็นเพราะเหตใดครับ ต้องใช้ systick ถึงจะได้

JENG


ลองแบบนี้ดูคับ :)

void delay_ms(uint32_t ms)
{
    static uint32_t len;
    for (;ms > 0; ms --)
        for (len = 0; len < 100; len++ );
}
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

tha

ไม่ได้คัฟคุณเจ๋ง ผมลองเอาฟังชั่น delay_ms ของ GLCD5110.h มาใช้แทนสามารถดีเลย์ได้แล้วคัฟ  >:(

void delay_ms(volatile unsigned long ms)  // delay 1 ms per count @ Crystal 8.0 MHz and PLL9x or SYSCLK = 72 MHz
{
   volatile unsigned long i,j;
for (i = 0; i < ms; i++ )
for (j = 0; j < 5525; j++ );
}


AppleIIe

หลายท่านอธิบายเรื่อง static ไปแล้วไม่ขอกล่าวซ้ำ ขอต่อในเรื่อง volatile เป็นหลักก็แล้วกันครับ

ข้อแตกต่างระหว่าง static และ volatile ลองศึกษาดูครับ
http://wiki.answers.com/Q/What_is_the_difference_between_static_variables_and_volatile_variables

ข้อแนะนำในการใช้ volatile
http://en.wikipedia.org/wiki/Volatile_variable
http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword

และหากเป็นไปได้ และหากได้มีการออกแบบจัด memory หรือวาง I/O ได้ดีแล้ว
การใช้ volatile ก็ไม่จำเป็นมากนัก และพยายามใช้ให้น้อยที่สุดครับ
หรือใช้ตามความจำเป็นจริงๆจะดีกว่า (ควรใช้ตามที่แนะนำจากข้อมูลก่อนหน้า)
https://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt

แต่สำหรับการเขียนกับพวกประเภท mutitask แล้ว volatile ก็ถือเป็นเพื่อนที่ดีเลยครับ(C++)
http://www.drdobbs.com/cpp/volatile-the-multithreaded-programmers-b/184403766

เสริมเพื่อความเข้าใจ
http://stackoverflow.com/questions/16259939/const-volatile-register-volatile-static-volatile-in-c

หรือหากท่าน tha ได้ลองทำ dissasm และอาจลองปรับการ optimize ของ compiler เพื่อให้เห็นการทำงานและลองศึกษาดู ท่านน่าจะเข้าใจได้มากขึ้นครับ
"Stay Hungry, Stay Foolish"
จงกระหาย และ ทำตัวโง่ให้ตลอดเวลา
"Innovation distinguishes between a leader and a follower."
นวัตกรรมแยกผู้นำกับผู้ตามออกจากกัน

คนฉลาด...ต้องโง่เป็น คนโง่ไม่เป็น...จะไม่มีทางฉลาด

tha

ขอบคุณครับ ข้อมูลดีมากเลยครับ แต่วันนี้มู๊ดไม่ได้คงต้องเอาไว้อ่านวันหลัง  >:( :) ;D