Cześć,
programowanie embedded nie przestaje mnie zaskakiwać.
Mam program, ogólnie dość rozbudowany, na procesor xmega. Program między innymi odtwarza dźwięk.
Zajmując się czym innym chciałem sobie czasowo mrugać ledem, więc do sprawdzania czasu korzystam z funkcji millis(), która wygląda tak:
Wydaje mi się, że jest to dość klasyczne rozwiązanie. Zmienna elapsed_time jest typu long i jest po prostu inkrementowana w przerwaniu o częstotliwości 1kHz.
Kod testowy wygląda tak:
Niestety po kilkunastu sekundach zaczyna mi się "rozjeżdżać" dźwięk - najpierw robi się tak, jakby był odtwarzany z dużego pomieszczenia, a potem całkowicie się wykrzacza. Niestety nie znam się za bardzo na jego obróbce, ale to by sugerowało chyba wprowadzanie jakichś opóźnień, chociaż nie kieruję się tym za bardzo. Ogólnie związek może być bardzo luźny, ale ze względu na to, że jest on odtwarzany cały czas, to on jest najbardziej oczywistym objawem.
Szukałem problemu długo, bo jaki może być związek? Koniec końców udało mi się replikować problem powtarzalnie, a także go uniknąć.
Jeśli
zamienię na
problem znika.
Jaka może być tego przyczyna? Tak szczerze mówiąc nie mam zielonego pojęcia jakie może to mieć znaczenie... Czy to kompilator coś optymalizuje? Czy szukać tutaj problemu w pamięci RAM? Ale jakim cudem taka drobna zmiana mogłaby doprowadzić do jakiegoś wycieku pamięci?
Z góry bardzo dziękuję za pomoc. Już się czułem mocniejszy w tym programowaniu, ale jednak zawsze człowiek szybko jest sprowadzany do pionu jakimś problemem tego typu, który zupełnie wykracza poza moje zrozumienie. A że jest to projekt komercyjny i nie mam możliwości późniejszej aktualizacji firmware, to zależy mi szczególnie na zrozumieniu go, a nie tylko uniknięciu.
programowanie embedded nie przestaje mnie zaskakiwać.
Mam program, ogólnie dość rozbudowany, na procesor xmega. Program między innymi odtwarza dźwięk.
Zajmując się czym innym chciałem sobie czasowo mrugać ledem, więc do sprawdzania czasu korzystam z funkcji millis(), która wygląda tak:
Kod: C / C++
Wydaje mi się, że jest to dość klasyczne rozwiązanie. Zmienna elapsed_time jest typu long i jest po prostu inkrementowana w przerwaniu o częstotliwości 1kHz.
Kod testowy wygląda tak:
Kod: C / C++
Niestety po kilkunastu sekundach zaczyna mi się "rozjeżdżać" dźwięk - najpierw robi się tak, jakby był odtwarzany z dużego pomieszczenia, a potem całkowicie się wykrzacza. Niestety nie znam się za bardzo na jego obróbce, ale to by sugerowało chyba wprowadzanie jakichś opóźnień, chociaż nie kieruję się tym za bardzo. Ogólnie związek może być bardzo luźny, ale ze względu na to, że jest on odtwarzany cały czas, to on jest najbardziej oczywistym objawem.
Szukałem problemu długo, bo jaki może być związek? Koniec końców udało mi się replikować problem powtarzalnie, a także go uniknąć.
Jeśli
Kod: C / C++
zamienię na
Kod: C / C++
problem znika.
Jaka może być tego przyczyna? Tak szczerze mówiąc nie mam zielonego pojęcia jakie może to mieć znaczenie... Czy to kompilator coś optymalizuje? Czy szukać tutaj problemu w pamięci RAM? Ale jakim cudem taka drobna zmiana mogłaby doprowadzić do jakiegoś wycieku pamięci?
Z góry bardzo dziękuję za pomoc. Już się czułem mocniejszy w tym programowaniu, ale jednak zawsze człowiek szybko jest sprowadzany do pionu jakimś problemem tego typu, który zupełnie wykracza poza moje zrozumienie. A że jest to projekt komercyjny i nie mam możliwości późniejszej aktualizacji firmware, to zależy mi szczególnie na zrozumieniu go, a nie tylko uniknięciu.
