eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › programowanie i kasowanie dwu kostek flash na jednej magistrali
Ilość wypowiedzi w tym wątku: 27

  • 11. Data: 2017-02-09 12:13:13
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: Pszemol <P...@P...com>

    Pszemol <P...@P...com> wrote:
    > Teraz na ten przykład krokuję program (breakpoint na wejsciu do funkcji
    > kasowania sektora) i widzę, że tak traktowany sprzęt zachowuje się ładniej
    > - zamiast wywalić się na kasowaniu pierwszego sektora (0x8000 0000)
    > przeszedł ladnie do kasowania
    > 0x800C 0000, 0x800E 0000, 0x8010 0000 zapisujac je po kolei bez zgłaszania
    > błędów i po skasowaniu 0x8012 0000 wykorbił się w czasie zapisu nowych
    > danych:
    >
    > Górna kostka, ta obsługująca bity D16..D31, zgłosiła błąd zapisu: ustawiony
    > bit D5 kostki (u mnie cpu widzi go jako D21) przy przestawianym wciąż bicie
    > D6 (u mnie D22).
    >
    > I co teraz? Zaczynam kurna podejrzewać nasz hardware... Może coś jest nie
    > tak z jakością 3V3... Czas przynieść oscylka :-)

    Kodensatorek osprzegajacy był na innej nodse podpiętej do 3v3 ale po
    podpieciu dodatkowego 220nF do nozki 43 nic sie nie zmieniło na plus...
    Dalej sie proces wykorbia w czasie kasowania lub programowania...


  • 12. Data: 2017-02-09 12:58:28
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: Adam Górski <gorskiamalpawpkropkapeel_@xx>

    On 2017-02-08 17:26, Pszemol wrote:
    > Adam Górski <gorskiamalpawpkropkapeel_@xx> wrote:
    >> A nie trzeba tam gdzies czekać na bity ze status registru ?
    >>
    >
    > Z tego pytania wnioskuję, że na funkcje zapisu i kasowania jakie tu podałem
    > nawet nie spojrzałeś :-)))
    >

    Spojrzałem. Nie podejmuje się analizowania czegoś takiego jak while( A,
    B,C ). Nigdzie nie widziałem jeszcze takiej konstrukcji.

    Czy możesz podpowiedzieć jaki jest oczekiwany rezultat takiej pętli ?
    Czy w takim wypadku oczekujesz wszystkich warunków niezerowych czy
    wystarczy jeden ? Inaczej mówiąc to jest bardziej jak && czy ||. A może
    tylko jedno jest warunkiem ?

    Widziałeś gdzieś definicję takiej pętli ? Wybacz moje niedouczenie.

    Z drugiej strony , na ilu szt. hardwaru masz takie zachowanie ?
    Może normalnie masz zwalony hardware.



    Adam


  • 13. Data: 2017-02-09 14:17:17
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: Piotrek <p...@p...na.berdyczow.info>

    On 2017-02-09 12:58, Adam Górski wrote:
    > Czy możesz podpowiedzieć jaki jest oczekiwany rezultat takiej pętli ?
    > Czy w takim wypadku oczekujesz wszystkich warunków niezerowych czy
    > wystarczy jeden ? Inaczej mówiąc to jest bardziej jak && czy ||. A może
    > tylko jedno jest warunkiem ?

    Ostatnie jest warunkiem. Reszta ma się po prostu wykonać przed
    wyliczeniem warunku.

    Piotrek


  • 14. Data: 2017-02-09 14:32:08
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: Adam Górski <gorskiamalpawpkropkapeel_@xx>

    On 2017-02-09 14:17, Piotrek wrote:
    > On 2017-02-09 12:58, Adam Górski wrote:
    >> Czy możesz podpowiedzieć jaki jest oczekiwany rezultat takiej pętli ?
    >> Czy w takim wypadku oczekujesz wszystkich warunków niezerowych czy
    >> wystarczy jeden ? Inaczej mówiąc to jest bardziej jak && czy ||. A może
    >> tylko jedno jest warunkiem ?
    >
    > Ostatnie jest warunkiem. Reszta ma się po prostu wykonać przed
    > wyliczeniem warunku.
    >
    > Piotrek
    >

    Dzięki. We wszystkich definicjach jakie widziałem zawsze jest while(
    condition ). Masz może namiar na opis standardu dopuszczającego takie
    użycie ?

    Adam Górski


  • 15. Data: 2017-02-09 14:56:18
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: Piotrek <p...@p...na.berdyczow.info>

    On 2017-02-09 14:32, Adam Górski wrote:
    > Dzięki. We wszystkich definicjach jakie widziałem zawsze jest while(
    > condition ). Masz może namiar na opis standardu dopuszczającego takie
    > użycie ?

    No i właśnie to condition jest grupą wyrażeń połączonych *operatorem* ,

    Było od zawsze ("The C programming Language" A.7.18). Chociaż
    rzeczywiście widziałem to użyte w kodzie może z pięć razy.

    Piotrek


  • 16. Data: 2017-02-09 17:03:31
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: Piotr Dmochowski <i...@p...onet.pl>

    W dniu 2017-02-08 o 20:31, Pszemol pisze:
    >
    > Zerknij proszę jeszcze raz na deklarację wskaźnika pStatus oraz zmiennych
    > Status1 i Status2.
    > To są obiekty 32-bitowe a więc obie kostki pamięci odpowiedzialne są za ich
    > zapis.
    >

    while(Status1 = *pStatus, Status2 = *pStatus, (Status1 ^ Status2) & (1
    << 2))
    Przepraszam że zawracam głowę, ale jaki jest sens robienia XOR na
    zmiennych pobierających wartość z tego samego adresu?
    Tam (praktycznie) zawsze będzie false, chyba że procesor akurat trafi na
    zmianę statusu drugiej kostki między jednym a drugim odczytem *pStatus,
    ale z takim szczęściem to lepiej kupony wypełniać niż babrać się w kodzie ;)

    --
    Pozdrawiam
    Piotrek


  • 17. Data: 2017-02-10 10:53:16
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "Pszemol" napisał w wiadomości grup
    dyskusyjnych:o7f8jr$e99$...@d...me...
    //check toggle bit2 indicating erase operation pending
    while(Status1 = *pStatus, Status2 = *pStatus, (Status1 ^ Status2) &
    (1 <<
    2))

    Tez mi sie ten kod nie podoba, ale patrze, patrze ... i bledu nie
    widze :-)
    Program sprawdzony z 1 koscia ?
    Pierwsze co mi sie nie podoba ... czytam status1, pamiec konczy
    czysczenie, do status2 czytam juz dane.
    Ale nieszczescia nie bedzie ... jak bit niezgodny, to przeczytamy
    jeszcze raz, a ewentualny blad bierzemy z bitow status1.
    Jak zgodny, to jak rozumiem pamiec zakonczyla kasowanie poprawnie ?

    {
    if(Status1 & (1 << 5)) // check error bit on one chip
    {
    LEDFRed();
    return 0;

    A te bledy sie zgadzaja ? Co wtedy robisz ?
    Bo tu mi jedna mozliwosc sie rysuje - pierwsza kostka zglasza blad,
    robimy return ... a druga sie ciagle kasuje.
    Jesli teraz zacznies jakies resety robic, to kto wie, jak to sie dla
    drugiej skonczy.

    }
    }
    while(Status1 = *pStatus, Status2 = *pStatus, (Status1 ^ Status2) &
    (1 <<
    (16+2)))

    To mi sie nie podoba - bo najpierw sprawdzalismy pierwsza koste, a
    druga lezala odlogiem.
    Ale jesli w tym czasie druga sie skonczyla ... to program pojdzie
    dalej, jak nie skonczyla, to poczeka,
    jak zglasza blad ... dlugo to wachlowanie bitem wtedy trwa ? Czy nie
    ma sytuacji takiej, ze druga kosc ma blad, a Ty ciagle w pierwszej
    petli sprawdzasz pierwsza. Pierwsza sie skasuje, a drugiej juz sie
    znudzi wachlowanie..

    {
    if(Status1 & (1 << (16+5))) // check error bit on second chip
    {
    LEDFRed();
    return 0;
    }
    }


    No i ... przerwania wylaczyles ? Bo jesli jakis odczyt sie zapląta
    miedzy odczyt status1 i 2, to zakonczysz czekanie przed czasem

    // Check the erase
    if(*pSector != 0xffffffff)
    {
    LEDFRed();
    return 0;

    Moze sprawdzic caly blok, a nie tylko poczatek ?
    Predkosciowo pamiec wyrabia ? moze trzeba troche opoznien dodac ?

    }
    else
    return 1;
    }

    // returns 1 if success
    int STFlashWrite32(unsigned int Address, unsigned char *pSource,
    unsigned int Size)

    A problem jest w kasowaniu czy w zapisie ?

    {
    int Timeout;
    U32 Status1, Status2;
    volatile U32 *pDest = (volatile U32 *)Address;
    U32 *pData = (U32 *)pSource;

    // EMCSC bit in System Controls and Status register is cleared in
    Flash_Init().
    // It controls how addresses are output on the EMC address pins.
    // For 32 bit bus the address is shifted so A2 is on A0 pin.
    U32 *pA1 = (U32 *)(EXTERNAL_FLASH_LOCATION + (0x555 << 2)); //555
    16bit
    mode
    U32 *pA2 = (U32 *)(EXTERNAL_FLASH_LOCATION + (0x2AA << 2)); //2AA
    16bit
    mode

    moze jakis volatile by sie przydal - bo jak kompilator wykryje, ze
    stale pod jeden adres zapisuje to samo, to moze zoptymalizowac.

    Cache jakiegos ten procesor nie ma ? Te zapisy wychodza do pamieci ?

    J.


  • 18. Data: 2017-02-10 15:55:13
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: Pszemol <P...@P...com>

    Piotr Dmochowski <i...@p...onet.pl> wrote:
    > W dniu 2017-02-08 o 20:31, Pszemol pisze:
    >>
    >> Zerknij proszę jeszcze raz na deklarację wskaźnika pStatus oraz zmiennych
    >> Status1 i Status2.
    >> To są obiekty 32-bitowe a więc obie kostki pamięci odpowiedzialne są za ich
    >> zapis.
    >>
    >
    > while(Status1 = *pStatus, Status2 = *pStatus, (Status1 ^ Status2) & (1
    > << 2))
    > Przepraszam że zawracam głowę, ale jaki jest sens robienia XOR na
    > zmiennych pobierających wartość z tego samego adresu?
    > Tam (praktycznie) zawsze będzie false, chyba że procesor akurat trafi na
    > zmianę statusu drugiej kostki między jednym a drugim odczytem *pStatus,
    > ale z takim szczęściem to lepiej kupony wypełniać niż babrać się w kodzie ;)
    >

    Piotrze, świetne pytanie.
    Bo to jest ciekawy fragment procesu kasowania pamieci flash i zapisu do
    niej.

    Taka pamięć ma wewnątrz sterownik ktory kontroluje te procesy niejako z
    wewnątrz kostki. Obsługujesz go przez wspólną magistralę danych i adresów -
    scalak pracuje w dwu trybach: odczyt danych (wtedy działa jak klasyczny
    ROM) oraz kasowanie/zapis: wtedy uzyskujesz dostep do wewnetrznego
    sterownika umówioną sekwencję bajtôw w roli "sezamie otwórz się!" I wtedy
    możesz wydawać sterownikowi polecenia kasowania/zapisu konkretnych
    lokalizacji pamięci... A sterownik informuje Cie o postepie operacji
    kasowania i o błedach ustawiajac stan bitow szyny danych. Miedzy innymi
    zmienia on stan bitu D6 gdy operacja jest wciaz w toku. Stad w kodzie dwa
    kolejne odczyty i stad użycie sugestii "volatile" do kompilatora aby tych
    dwu odczytów nie "zoptymalizowal" myslac ze są bez sensu, tak jak Ty
    pomyślałes :-))

    Nawiasem mówiąc zmiana testu bitu D2 na bit D6 w czasie kasowania pomogla -
    nie mam juz błędów o ktorych pisałem wcześniej.
    Muszę jeszcze raz się przyjrzeć tym flołczartom z dataszyta :-) i
    przypomnieć sobie dlaczego pisząc ten kod uznałem że testowanie D6 będzie
    dobre w czasie zapisu flash a powinienem testować D2 w czasie kasowania...


  • 19. Data: 2017-02-10 17:47:47
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: Piotr Dmochowski <i...@p...onet.pl>

    W dniu 2017-02-10 o 15:55, Pszemol pisze:
    > Piotr Dmochowski <i...@p...onet.pl> wrote:
    >> W dniu 2017-02-08 o 20:31, Pszemol pisze:
    >>>
    >>> Zerknij proszę jeszcze raz na deklarację wskaźnika pStatus oraz zmiennych
    >>> Status1 i Status2.
    >>> To są obiekty 32-bitowe a więc obie kostki pamięci odpowiedzialne są za ich
    >>> zapis.
    >>>
    >>
    >> while(Status1 = *pStatus, Status2 = *pStatus, (Status1 ^ Status2) & (1
    >> << 2))
    >> Przepraszam że zawracam głowę, ale jaki jest sens robienia XOR na
    >> zmiennych pobierających wartość z tego samego adresu?
    >> Tam (praktycznie) zawsze będzie false, chyba że procesor akurat trafi na
    >> zmianę statusu drugiej kostki między jednym a drugim odczytem *pStatus,
    >> ale z takim szczęściem to lepiej kupony wypełniać niż babrać się w kodzie ;)
    >>
    >
    > Piotrze, świetne pytanie.
    > Bo to jest ciekawy fragment procesu kasowania pamieci flash i zapisu do
    > niej.
    >
    > Taka pamięć ma wewnątrz sterownik ktory kontroluje te procesy niejako z
    > wewnątrz kostki. Obsługujesz go przez wspólną magistralę danych i adresów -
    > scalak pracuje w dwu trybach: odczyt danych (wtedy działa jak klasyczny
    > ROM) oraz kasowanie/zapis: wtedy uzyskujesz dostep do wewnetrznego
    > sterownika umówioną sekwencję bajtôw w roli "sezamie otwórz się!" I wtedy
    > możesz wydawać sterownikowi polecenia kasowania/zapisu konkretnych
    > lokalizacji pamięci... A sterownik informuje Cie o postepie operacji
    > kasowania i o błedach ustawiajac stan bitow szyny danych. Miedzy innymi
    > zmienia on stan bitu D6 gdy operacja jest wciaz w toku. Stad w kodzie dwa
    > kolejne odczyty i stad użycie sugestii "volatile" do kompilatora aby tych
    > dwu odczytów nie "zoptymalizowal" myslac ze są bez sensu, tak jak Ty
    > pomyślałes :-))
    Widziałem deklarację z volatile, więc wiem że powinny być 2 odczyty.
    Zastanawia mnie jaki jest sens odczytania danych z jednego adresu i
    zrobienie na nich XORa. Jeżeli między jednym a drugim odczytem nie
    będzie zmiany to wynik będzie zerowy i program nie wejdzie do pętli -
    takie jest moje rozumowanie. Może w praktyce jakoś to działa, ale
    zastanawiam się jaki jest margines błędu w takim rozwiązaniu.
    Jak najbardziej rozumiem pobranie jednego statusu i sprawdzenie D6, bez
    XOR to nie pójdzie?
    Ja bym dał w pętli odczyt statusu i sprawdzenie D6. Wyjście z pętli
    jeżeli D6 ma odpowiednią wartość lub liczba sprawdzeń przekroczyła np.
    100 (i sygnalizacja błędu przekroczonego czasu trwania operacji).

    Chyba że czegoś nie ogarniam i ten odczyt z pamięci ma jakieś dodatkowe
    skutki i może spowodować zmianę odczytanej wartości, ale bez takiej
    wiedzy nie do końca mi się to składa w całość.

    Tak przy okazji pokazywania kodu - myślę że nawet po jednym zdaniu
    komentarza przed kawałkiem kodu byłoby dobra zachętą do analizowania
    przez grupowiczów, a i koledzy w pracy pewnie tez docenią jak będą
    chcieli coś pozmieniać :)

    --
    Pozdrawiam
    Piotrek


  • 20. Data: 2017-02-10 17:54:46
    Temat: Re: programowanie i kasowanie dwu kostek flash na jednej magistrali
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "Piotr Dmochowski" napisał w wiadomości grup
    W dniu 2017-02-10 o 15:55, Pszemol pisze:
    >> Piotrze, świetne pytanie.
    >> Bo to jest ciekawy fragment procesu kasowania pamieci flash i
    >> zapisu do
    >> niej.
    >> Taka pamięć ma wewnątrz sterownik ktory kontroluje te procesy
    >> niejako z
    >> wewnątrz kostki. Obsługujesz go przez wspólną magistralę danych i
    >> adresów -
    >> scalak pracuje w dwu trybach: odczyt danych (wtedy działa jak
    >> klasyczny

    >Widziałem deklarację z volatile, więc wiem że powinny być 2 odczyty.
    >Zastanawia mnie jaki jest sens odczytania danych z jednego adresu i
    >zrobienie na nich XORa. Jeżeli między jednym a drugim odczytem nie
    >będzie zmiany to wynik będzie zerowy i program nie wejdzie do pętli -
    >takie jest moje rozumowanie.

    Taka ta pamiec - poki sie kasuje, to odczytuje nie dane z pamieci,
    tylko rejestr statusu, w ktorym sa dwa "toogle bit".

    A jak sie skonczy kasowac, to przestaje migac bitami i petla ma sie
    zakonczyc.

    >Może w praktyce jakoś to działa, ale zastanawiam się jaki jest
    >margines błędu w takim rozwiązaniu.
    >Jak najbardziej rozumiem pobranie jednego statusu i sprawdzenie D6,
    >bez XOR to nie pójdzie?

    Jak odczytasz raz, to nie wiesz czy bit miga, a wiec nie wiesz czy to
    rejestr statusu czy dane z pamieci.

    J.

strony : 1 . [ 2 ] . 3


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: