Tzn. linię: KEEP(*(.vectrs)); ? I ją wstawić do nowej sekcji? Dokładnie.
W plikach ".cpp" extern "C" [syntax=c]extern "C" void SysTick_Handler(void) { GPIOA->MODER = 0; }[/syntax]
Nie wyliczysz tego na etapie kompilacji. Wartości są bowiem znane dopiero po linkowaniu. Powinien to załatwiać soft do programowania. Możesz też modyfikować pliki wynikowe. Albert
Zerknij sobie to pliku .lss i sprawdź następujące rzeczy: 1. czy w ogóle jest tam funkcja SysTick_Handler 2. czy adres funkcji SysTick_Handler zgadza się z adresem widocznym w tablicy wektorów (pod adresem 0x800003c) - adres w tablicy wektorów będzie miał nieparzystą wartość (jeśli np. funkcja SysTick ma adres 0x8001000, to w tablicy wektorów będzie...
Startup bez zmian. Skrypt linkera - zmienić rozmiar pamieci. Tablica wektorów - poniżej. 4\/3!!
Też kiedyś o tym myślałem: http://www.elektroda.pl/rtvforum/topic18... Ja bym umieszczał CRC gdzieś na początku programu (w temacie wyżej było na końcu bo był z góry znany rozmiar pamięci FLASH). Rozwiązanie z umieszczaniem tego w tablicy wektorów albo tuż za ostatnim elementem tablicy wektorów jakoś najbardziej mi się podoba.
Wydaje mi się że nie "przesunąłeś" tablicy wektorów przerwań: SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; w pliku system_stm32l4xx.c
No to musisz mieć tablicę wektorów w RAM [; 4\/3!!
Tylko w tablicy wektorów musisz poprawki wprowadzić. Skrypt linkera nie ma tu znaczenia. 4\/3!!
To akurat nie jest tablica wektorów tylko procedura obsługi DH. Nie możesz sobie plików z jednego procesora do drugiego. Tylko taki z twojego. Ponieważ nie wiem jaki jest on dokładnie to masz przykładowy:
Użyj sekcji .progmem.gcc - położona jest ona tuż za tablicą wektorów przerwań i standardowo nic w niej nie ma, a więc ma stały dla danego procesora adres początku.
Ok. Przeszukaj pliki w swoim projekcie po nazwie "SysTick_Handler". Znajdziesz tą nazwę w pliku asemblerowym (lub w pliku *.c) w tablicy wektorów przerwań. Ta tablica zawiera między innymi adres funkcji o nazwie SysTick_Handler. Linker umieszcza tablicę pod odpowiednim adresie w pamięci (zgodnie z datasheet procesora).
Przeczytaj ten wątek i kup sobie inną płytkę. Co ma płytka wspólnego z tym problemem. Jak tablica wektorów jest zła to nic nie pomoże. Nawet zrobiłem porównanie STM-owego nagłówka z tym autora.
teraz postanowiłem uruchomić timer 2 i w żadnych plikach nie widzę funkcji do tego timera. To poszukaj dobrze - musi być w pliku w którym jest tablica wektorów, być może jest to ten sam plik w którym jest startup.
Weź wszystkie podstawowe pliki (startup, skrypt linkera, tablicę wektorów, Makefile) z jednego źródła, bo jak je mieszasz to nigdy nie wiadomo co nie zadziała. 4\/3!!
Nie nie nie nie... Swoją funkcję musisz po prostu nazwać tak jak jest w tablicy wektorów, czyli: void FIQ_Handler(void) __attribute__ ((interrupt("FIQ"))); void FIQ_Handler(void) { ... i już. 4\/3!!
Bo może wektor przerwań dla tego akurat kanału DMA się nazywa inaczej? Porównaj nazwę Twojej funkcji z zawartością tablicy wektorów. Jeśli masz w projekcie pliki C++, to trzeba przerwania deklarować jako extern "C". 4\/3!!
Po wygenerowaniu projektu w Cube nie ma definicji tych funkcji w main.c No to chyba dość oczywiste. Zobacz jak się nazywają tam gdzie jest tablica wektorów. Np w projektach z cube to bedzie .S plik w katalogowy startup albo coś w tym guście
No ale jak zrobisz takie przyporządkowanie o jakim piszesz (bez podziału) to funkcja Reset_Handler ma adres w RAM, więc w tablicy wektorów będzie adres w RAM. Oczywiście zanim ten Reset_Handler się uruchomi, to w RAM nic nie ma - tak więc to nie ma prawa działać... 4\/3!!
Witam, Wg manual'a do procesora Cortex M3 jeśli się zmienia kod programu lub/i tablicę wektorów przerwań, to przed następną instrukcją powinno się użyć instrukcji ISB, DSB i DMB aby bufory załadowały nowe wartości.
widzę, że jesteś niezłym magikiem bo twoje makefile jest w ogóle nie podobne do tego generowanego przez AVRStudio. Ponieważ nie korzystam z AVRStudio. Ale spróbowałem tak z ręki skompilować ten twój bootloader: make bootloader zazwyczaj kompiluje się przez samo "make", tutaj przez "make all" i niestety dostaję błąd: makefile:28: *** missing separator....
Może inaczej przerwanie jest to wystąpienie określonego zdarzenia . Wektor przerwania to miejsce (adres fizyczny w pamięci programu do którego przechodzi mikrokontroler po wystąpieniu określonego przypadku) generalizując tablica wektorów zazwyczaj zawiera jedynie skoki do pod programów obsługi przerwania . Tak bardziej obrazowo siedzisz przed komputerem...
Na wypadek, gdybyś nie zauważył: przy takich deklaracjach i treści procedury konfiguracji DMA, jakie masz obecnie, do rejestru adresu pamięci DMA wpisujesz wartość bajtową odczytaną z pamięci ze zmiennej TxBuf, rozszerzoną zerami do 32 bitów, czyli wysyłasz przez UART zawartość tablicy wektorów wyjątków.
Też nie bardzo wiem jaka jest nazwa (wektor) funkcji tego przerwania, więc mam tak: Przecież wystarczy zajrzeć do tablicy wektorów i wszystko stanie się jasne... Można też zajrzeć do manuala, aby dowiedzieć się, że system CSS jest zmapowany na przerwanie NMI. Nie wiem czy czekanie na odpowiedź na forum jest naprawdę szybsze... 4\/3!!
W tablicy wektorów zupełnie nic nie zmieniasz (jak zwykle) - system masz połączony ze sprzętem poprzez te 3 definicje: #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define xPortSysTickHandler SysTick_Handler Mam nadzieje że masz je w jakimś pliku dołączonym do port.c, np FreeRTOSConfig.h 4\/3!!
#include <iostream> #include <vector> using namespace std; int main() { int x=4; vector<int> *tablicaWektorow; tablicaWektorow=new vector<int>[x]; //wpisanie jakis wartosci do wektorow; for(int i=0;i<12;i++) { if(i<3) tablicaWektorow[0].push_back(... else if(i<6)...
SYSCFG->EXTICR Nie powinieneś działać na rejestrze 0? void EXTI1_0_IRQHandler(void) To przerwanie na pewno się tak nazywa? Bo tutaj się nazywa ...0_1... NVIC_EnableIRQ(EXTI0_1_IRQn); Masz dobrą tablicę wektorów? 4\/3!!
Po czym to rozpoznałeś? Powtarzające się bloki po 8 bajtów na początku pliku wyglądają na zaszyfrowaną tablicę wektorów przerwań. Nie zaszyfrowane powinny się powtarzać 4 bajty adresu we flashu lub ramie. Ktoś się nie przyłożył do szyfrowania. Jak by było zrobione porządnie to cały plik wyglądał by na losowy. Nie jest to AES ani prosty XOR. XTEA? Raczej...
Proszę o informacje, gdzie w nocie katalogowej można znaleźć informacje na temat priorytetów wykonywania przerwań, jeżeli wystąpią w tym samym czasie. Nie można, ale ten co ma niższy adres w tablicy wektorów wykona się pierwszy jak przyjdą w tym samym czasie. Co najwyżej możesz właczyć przerwania na początku obsługi aby umożliwić obsługę kolejnych...
Adres 0x00000014 nieużywany przez ARM, NXP zaadoptował jako sumę kontrolną tablicy wektorów. Jeśli masz tam coś innego uruchomi się ISP. Poprawnie wywołane programowanie zerowego sektora na pewno działa bo wykorzystują to chyba wszystkie programatory działające pod JTAG. Bootloader wysoko jest fajny, ale ma wadę. Wgranie złego programu, lub błąd przy...
Toż Ci piszę, że tablice wielowymiarowe to abstrakcja - i tak są mapowane do tablic 1W (wektorów). Wektor o długości 16 elementów, możesz równie dobrze traktować jako tablicę 2W o wymiarach 4 x 4 - wzór na przeliczenie indeksów 2W na 1W podałem w poprzednim poście. Dim Tablica(16) As Byte Dim X As Byte Dim Y As Byte Dim N As Byte Dim I As Integer...
Cześć, Mam problem ze zmianą położenia tablicy wektorów przerwań na STM32F417. Potrzebuję dostępu do pierwszych 4 sektorów pamięci, więc rdzeń musi od początku szukać wektorów pod innym adresem. Odpalenie programu normalnie, a potem ręczne przesunięcie wektorów nie wchodzi w grę. Potrzebują początkowych sektorów do przechowywania nieulotnych danych...
Taki program nie ma prawa działać poprawnie, ponieważ przesuwasz tym sposobem również tablicę wektorów, która akurat musi być w jednym i konkretnym miejscu. No chyba że masz już ten bootloader, który uruchamia Twój kod, skacząc pod odpowiedni adres. Pozatym widze, że korzystasz z dosyć starego skryptu, proponowałbym taki trochę nowszy, bo w tym jest...
Zapisujesz do flash przy pierwszym uruchomieniu po programowaniu. Po resecie sprawdzasz czy tam jest ta wartość i jezeli jest to jest pierwsze uruchomienia, a jeżeli nie to kolejne Bez flagi to raczej się nie da (aslbo przynajmniej sprawdzenia czy coś jest zaprogramowane). Oczywiście mogę sobie wyobrazić rozwiązanie typu - ResetHandler jest do procedury...
Popatrz bardzo dobrze na te linijki: GPIOA->MODER = (0x01 < (2 * 0)); //Pin PA0 jako wyjście //GPIOA->OTYPER &= ~(1 < 0); //Pin PA0 jako Push-Pull GPIOA->OSPEEDR = (0x03 < (2 * 0)); //Pin PA0 jako High Speed Tablica wektorów ma marginalne znaczeni dopóki nie używasz przerwań - bez nich wykorzystywane...
W pracy mam jakiegoś AVR64 lub AVR128 , już nie pamiętam co kupiłem. Ale będę miał dostęp dopiero pod koniec tygodnia. Teraz możemy zrobić mały eksperyment i sprawdzić jaki jest rzeczywisty rozmiar wektora przerwań. W załączeniu projekt w ASM który powoduje wywołanie przerwania NMI czyli następny wektor po RESET. Przy czym dzięki temu że mamy projekt...
Pytanie trochę filozoficzno - humorystyczne. Czy chodzi o to aby oszukać oszusta? ;) Wówczas w Cobrze1 będzie dwóch oszustów? Domyślam się, że twórcy COBRA1 umieścili kod startowy od adresu 0xc000 ponieważ gdyby ROM zaczynał się od 0x0000, adresy wektorów przerwań byłyby na stałe w ROM i program użytkownika nie mógłby ich modyfikować. Program wykonywany...
Słuszna uwaga z tym startupem. Mam go w katalogu projektu, który jest wskazany w ścieżkach eclipsa, ale nie wiem dlaczego nie jest linkowany. Może ma nieprawidłowe rozszerzenie? Teoretycznie istotna jest wielkość liter. Freddie, czy masz może jakiś ładny przykładowy projekt dla CM0? Dla STM32F0 nie, ale możesz spokojnie zrobić małego frankensteina...
Po łebkach opisany algorytm... 1.Rysowanie wektora robisz tak a)rysujesz kreskę b)rysujesz trójkąt na końcu (pozycję obliczasz z wykorzystaniem zamiany wartości x/y c)wypełniasz trójkąt czarnym kolorem d)jeżeli jest włączona opcja przesuwania wektora to dodatkowo rysujesz 3 kólka (na początku, na środku do przesuwania całego wektora i na końcu) 2.Dane...
:) Kto szuka nie (ten) błądzi. Dzięki za cierpliwość. Na chwilę obecną przyjmę to za pewnik. Temat jednak pozostawiam otwarty. Jeśli ktoś z czytelników rozumie mą rozterkę i potrafi mi wyjaśnić dlaczego tak a nie inaczej...to proszę się nie krępować :D PS Szczerze mówiąc dziwi mnie trochę to, że Ciebie jako fana logiki nie zastanawia pozorna bezsensowność...
Głupi może pomysł, bo ja tylko asm, ale może to? #include <avr/io.h> avr/interrupt.h inkluduje go. Ja od razu mówię Ci, że używa tego starego skoro Ci nie działa. Naprawdę go wywal i będzie po problemie... Po co Ci tak stary kompilator? 4\/3!! Też tak myślę - interfejs przerwań się zmienił jakiś (spory) czas temu a tutaj ewidentnie ISR() nie...
Włączyłeś przerwania, jednak nigdzie nie masz procedury obsługi dla RXCIE i TXCIE. Wywołanie przerwania powoduje skok programu pod adres zdefiniowany w tablicy wektorów przerwań, czyli w Twoim przypadku reset procka. Druga sprawa to błąd w tej funkcji. Ona nigdy się nie zakończy, gdyż brakuje inkrementacji wskaźnika s w pętli. Ale zakładam, że to błąd...
Wygląda na to, że się całość się jakoś skompilowała pomimo warningów i zlinkowała (bo powstały mi pilki hex i elf). ...aczkolwiek rozmiar pliku wynikowego *.hex = 34 bajty każe przypuszczać, że jeszcze sporo przede mną... Brakuje Ci tablicy wektorów i startupa. Prościej będzie Ci zacząć od kompletnego przykładu, ewentualnie od przykładu + modyfikacje...
To poczytaj sobie o pisaniu bootloaderów. Tu tematów było kilka. Po co marnować aż 512kB na bootloader? 1. start programu (jest lub nie) przy takiej wersji bootloadera zakładam ze będzie wgrywany razem z jakąś wersją aplikacji. 2. aplikacja na jakieś polecenie reaguje i wywołuje bootloader mający swoją tablice wektorów. 3. aktualizacja oprogramowania....
Zakładając 0 stosu i heapu w skrypcie linkera (po to aby nie zmącać Ci obrazu bo on się doda do BSS). Ty oczywiście ustaw je na wartości takie jak powinny być w programie. [syntax=c]make --no-print-directory post-build Generating binary and Printing size information: arm-none-eabi-objcopy -O binary "101n.elf" "101n.bin" arm-none-eabi-size "101n.elf"...
z tego co widzę to 19 przerwanie czyli moje prowadzi pod inny adres niż wszystkie No tak, tyle ze to przerwanie jest "19-te", tyle że przed nim jest kilka systemowych. Wg tabelki w manualu tych układów, adres wektora przerwań dla TIM14 to 0x8c, natomiast u Ciebie wektor jest pod 0x68... Błąd masz taki, że za bardzo w nią zaingerowałeś... Zwróć uwagę,...
Przed uruchomieniem aplikacji przez bootloader należy: - przestawić wskaźnik głównego stosu, - przestawić tablicę wektorów. Robisz te dwie rzeczy? Poniżej fragment mojego bootloadera w którym wykonuję skok do aplikacji. Wszystkie przerwania i układy peryferyjne są "zresetowane" wcześniej. [syntax=cpp-qt]/// beginning of flash block for firmware extern...
Witam, tylko po co w mieszać automat sekwencyjny, skoro wystarczy użyć kombinacyjnego (bez przerzutników). Przecież jednoznaczność wektora wyjściowego względem wejściowego jest jednoznacznie zdefiniowana. Napisz sobie Tablicę Prawdy w postaci binarnej dla obu wartości wektorów i po wszystkim. No prawie, bo jeszcze należy rozpisać na podstawie Tabeli...
Próbuję pożenić template Freddiego (stm32_blink_led) z StdPeriph Ale to widziałeś? http://www.freddiechopin.info/pl/artykul... Ma ktoś pomysł co może być nie tak ? W skrypcie linkera należy ustawić rozmiar stosu dla przerwań - domyślnie jest zero, co zwykle źle się kończy. Ustawiłeś...
te 2 pliki musze zmienić oraz dane w makefile i linkerze tak ?? W Makefile to za dużo zmian nie będzie (może jakieś nazwy plików), więc głównie linker i tablica wektorów. O to jaki kompilator będzie użyty chodziło mi że w includes są scieżki do g++ i jeśli będzie kompilować się w edge to nie będzie żadnych komplikacji ?? Te ścieżki są wykrywane automatycznie...
U mnie kod: .org 0 start: inc r1 rjmp start działa poprawnie (AVR Studio 4, ver 4.12 sp1 build 462). No wiec asemblacja przebiega prawidlowo, lecz podczas debugowania program wyskakuje z obiegu. Tzn. co się dzieje ? Co do eeprom, spróbuj tak: .ESEG eevar1: .DW 0x1234 Po asemblacji wygenerowany zostanie plik nazwa_projektu.eep, wrzucasz go za pomoca...
Nie robisz kompletnie nic oprócz wskazania linkerowi pod jakim adresem ma być zlokalizowany kod wynikowy. Tablica wektorów przerwań która pierwotnie była pod adresem 0 znajdzie się pod adresem przekazanym linkerowi - -Wl,-Ttext,0x1e00 spowoduje, że cała sekcja .text (razem z tablicą wektorów) zostanie przeniesiona pod adres bootloadera - właśnie z tego...
Czyli jeśli w kodzie C inicjuję jedynie wektor powiedzmy ADC_vect, to jedynie w kodzie asemblerowym jedynie .org ADCaddr będzie pozbawione komentarza <__bad_interrupt>. A propos wektorów i tablicy: Czy inicjalizacja tablicy wektorów przerwań jest zależna od typu mikrokontrolera? W literaturze i w poradnikach internetowych widzę, że wszędzie wektory...
po co w niektórych implementacjach takich 'rozbiegówek' mamy kod assemblerowy który kopiuje adres stosu do rejestru SP procesora? STM32 może używać dwóch stosów - jednego dla przerwań (nazwanego wyjątkowo myląco "main stack") i drugiego dla wątków (nazwanego "process stack") - a więc i dla "main()". To co jest w tablicy wektorów ląduje w MSP ("main...
vtable? To vtable od polimorficznych funkcji C++ (virtual, dziedziczenie klas, ...)? Wiesz że vtable to nie jest to samo co tablica wektorów przerwań? Przy okazji, tablica wektorów przerwań musi być we flash, dopiero po uruchomieniu układu (bez niej się nie uruchomi) można sobie przestawić NVIC tak aby korzystał z tablicy w RAM. Tak więc należy jedynie...
Tzn, że program może działać dalej poprawnie a debuger wskazuje na to, że jesteśmy w np HardFaultHandlerze ? Mógłbyś nieco rozwinąć myśl ? Czasem może być jakiś problem sprzętowy/programowy/systemowy, który może spowodować wywalenie się debuggera, który będzie np. uparcie twierdził, że jesteśmy wciąż w jakiejś linii, choć mikrokontroler sobie wtedy...
Zakładam, że pytasz o sytuację uruchomienia jednego programu (normalnego) przez drugi (bootloader)? Generalnie dobrze by było, gdyby ten bootloader po sobie sprzątał, tzn np. wyłączał wszystkie układy peryferyjne których używał, doprowadzając całość do stanu jak najbardziej zbliżonego do prawdziwego resetu. Po stronie "normalnego" programu generalnie...
Nic, chyba że masz jakiś nietypowy układ który ma inną tablicę wektorów. Np STM32F105 i 107 mają inną niż 103 - dlatego w przykładzie stm32cl_blink_led jest inna tablica wektorów. Tak apropo to te błędy OpenOCD o których mówisz możesz zignorować - nie oznaczają one żadnego problemu. 4\/3!!
Co będzie błędne, bo pierwszą rzeczą jaką robi Twój program jest jednak Reset_Handler, a nie to co przypadkiem trafiło na początek sekcji .text. Co nic nie zmieni bo i tak tablica wektorów jest zapisana "na sztywno" w większości projektów. Tak naprawdę jest to wartość ignorowana jeżeli tablica wektorów jest zrobiona tak jak w większości projektów -...
Radzę zignorować powyższą poradę... Tablica wektorów ma poprawną "formę", więc radzę jej nie psuć... Wielu osobom działa, więc nie szukaj błędu tam gdzie go nie ma. Zresztą gdyby ta część była błędna, to układ nawet by nie wystartował, wiec chyba jednak warto założyć, że nie ma tu "błędu". W tablicy wektorów popraw tylko te wektory, które są "powyżej"...
Na początku flasha masz tablicę wektorów przerwań. Za pomocą NVICa możesz przesunąć tą tablicę lub przenieść do RAM. W załączniku masz przykładowy plik z tablicą wektorów przerwań
A ja zapytam : czy w tablicy wektorów przerwań znajduje się pod właściwym adresem handler obsługi przerwania od UART4? Bo zapewne nie i dlatego ląduje w DefaultHandlerze. Podejrzewam, że tablicę wektorów masz od STM32 z trzema uartami.
Problem z przerwaniami a raczej ich brakiem był związany, wg mojej wiedzy/ obserwacji z nieprawidłowym przeniesieniem tablicy wektorów przerwań. Same instrukcji wg książki: [syntax=c] MCUCR|=(1<<IVCE);// Uaktywnij zmianę wektorów przerwań MCUCR|=(1<<IVSEL);// Przenieś przerwania do sekcji boot-loadera [/syntax] Nie działały, trafiłem na...
Zbyt dużo Ci nie pomogę chyba - niestety składnia poleceń kompilacji której oczekuje Twoja wersja kompilatora jest zupełnie inna niż moja, dlatego też nie mogę skompilować Twojego przykładu u mnie. Po podstawieniu mojego Makefile'a do Twojego projektu wszystko kompiluje się bez większych problemów (konieczne są drobne zmiany w skrypcie linkera - ustawienie...
#pragma vector = <VECTOR_NAME> __interrupt void <ISR_NAME> (void) { // сюда вписыk... код обрабl... прерыk...
zobacz co masz w offsecie 0xE0 w tablicy wektorów (tej we flash)
Tak jak pisze Freddie Chopin mozna ale to bedzie reczne rzezbienie i skladanie kodu tak by zostawic dziure... Ale to jest rzezba okropna i utrudni na pewno prace nad kodem. Takiego rzezbienia nawet w binarce jest jeszcze kilka opcji, ale to nie najlepsze rozwiazanie. Wystarczy zapełnić tą jedną czy dwie strony rzeczami które praktycznie nigdy nie zmieniają...
nie pamiętam w 103 ale jeżeli nie momzna zremapować to wydaje mi się że i tablicę wektorów powinnieneś ustawić.
(at)tomeeh No jezli tak to rzeczywicie przepraszam. Ale - jeeżli tablica wektorów jest ok i wywoywane jest poprawne przerwanie - a skacze gdzie indziej to znaczy że symulator nie działa jak należy. Są dwie możliwości - sprawdzić z DS-em po tablicę wektorów i jeżeli się zgadza to sprawdzić jakie przerwanie się wywołuje tak naprawdę. Nie będę pisać jak,...
Nie mnie wygodne niż Twoja tablica wektorów w C ;)
Tablica wektorów przestawia się sama w zależności od konfiguracji pinów BOOTx. 4\/3!!
Pytasz mnie po co jest tablica wektorów czy dlaczego jest w osobnym pliku? 4\/3!!
A przyczyna była błacha. Albo to przeoczyłem bo zdublowałem trochę kodu z aplikacji st u siebie - albo tego tam nie było. Nie był ustawiony adres bazowy tablicy wektorów przerwań - a powinien być na flash. A przed wywołaniem kodu st była u mnie pozostałość (z wcześniejszych aplikacji) która ustawiała adres bazowy tablicy wektorów na ram. no i przerwania...
Dla całej aplikacji. W pliku z tablicą wektorów.
Problem udało się rozwiązać. Jest to program w tzw. "bare metal" tworzony w GNU Macro Assemblerze. Wygląda na to, że jako szablon wziąłem ustawienia z Blue Pill, a skoro działało z ST-LINK, to niczym się nie przejąłem. Dopiero teraz, gdy odłączyłem programator, okazało się, że to był błąd i Macro Assembler źle inicjował tablice wektorów dla STM32H7....
(at)robiw na 99.99% to błąd kompilatora, bo kiedy definiujemy procedurę przerwań np. ISR(INT0_vect) to w domyśle jest ISR(INT0_vect, ISR_BLOCK), czyli w trakcie wykonywania przerwania ponowne przerwanie nie zostanie wywołane dopóki aktualne się nie zakończy. Ten rcall powoduje że blokowanie zostało zdjęte przez reti i to jest problem. No i kod wcale...
Tak, dodawanie czy odejmowanie to takie same operacje na wszystkich odpowiadających współrzędnych. Gorzej trochę z mnożeniem czy dzieleniem... Takie operacje na wektorach (macierzach) wykonuje się już w trochę bardziej złożony sposób. Najwygodniej, jakbyś poprzestał na mnożeniu i dzieleniu przez liczbę - wtedy po prostu każdy element tablicy mnożysz...
Tylko jakim cudem tobie się tablica wektorów "sama" zmienia? Może remapujesz ową tablicę niepotrzebnie (rejestr MEMMAP)? 4\/3!!
:arrow: chyba miales na mysli rjmp w tablicy wektorów... pozdro!
Swoją drogą, jeżeli to jest listing Twojego programu to coś jest grubo nie w porządku - brakuje chociażby tablicy wektorów.
A jak plik z tablicą wektorów jest w c to jak odwołać się do jakiejś klasy w przerwaniu (nigdy tego nie próbowałem)?
Funkcje te muszą się nazywać tak jak etykiety użyte w tablicy wektorów. 4\/3!!
To nie chodzi o "zakomentowanie" początku i końca wrappera, tylko o zupełnie inny sposób wejścia do przerwania. Jeśli nie masz zagnieżdżeń, to powinno to być zrobione w tablicy wektorów i wyglądać podobnie do tego (dla LPC2103): ldr pc, [pc, #-0xFF0] // Interrupt exception -> VIC Swoją drogą, to chyba dla Atmeli nawet wygląda to identycznie. Oczywiście...
a może jeszcze inaczej a. plik asemblera budujący tablice wektorów przerwań b. kompilacja z opcją -nostartfiles lub tez zmiana skryptu linkera ??? Rozwiązanie o tyle nieelastyczne, że trzeba będzie ręcznie edytować każdy element tablicy wektorów podczas gdy potrzebuję zmodyfikować jedynie wektor INT0, a w stosunku do pozostałych wektorów chciałbym aby...
Skonfigurowałem w tym procesorze odbiór i nadawanie poprzez rs232. Jak stworzyć przerwanie od odbiornika? Gdzie jest tablica wektorów obsługi przerwań itp?
Witam, ze względu na używanie bootloadera w obszarze od 0x8000000 do 0x8004000, potrzebuję pozostałą część aplikacji (nazwijmy ją częścią B) umieścić w dalszym zakresie. Tak więc zmieniam adres aplikacji B oraz wektora przerwań i niestety urządzenie jest rozpoznawane w systemie. Aczkolwiek sam kod działa. Jeśli aplikacji B zmienię adres startowy na...
Proszę bardzo: Drugi assembler daje taki output: Niestety trzebaby posiedzieć nad konfiguracją, żeby wskazać mu obszary, które są tablicami wektorów coś jak tutaj: http://www.techedge.com.au/utils/dhc11tu...
Jest źle. Porównaj tablicę wektorów z tą z dokumentacji mikrokontrolera - w Connectivity Line nie ma DMA2_Channel4_5_IRQHandler . Są osobne wektory dla tych kanałów.
Miałem na myśli startup, zawierający tablicę wektorów i czy nie zachodzi np. HardFault/UsageFault/BusFault... Najprościej podpiąć pod te wektory zapalenie LED-a...
W skrypcie linkera muszą być zadeklarowane symbole o nazwach jak wyżej wyznaczające obszar pamięci przeznaczony dla sterty (heap). Proponuję ściągnąć projekt dla lpc2103 i przystosować postawowe pliki (startup, Makefile, skrypt linkera, tablica wektorów: lpc2103_rom.ld, Makefile, startup.S, vectors.S, hdr\hdr_cpsr.h) do swojego projektu, a większość...
No masz rację. Moje błędy. Bardziej mi chodzi o to czy programowo jest dobrze? Przede wszystkim nie wiem czy te próbki zapisują się do tych tablic wektor i wektor_napiec. Nawet nie wiem jak to sprawdzić...
Skąd masz bazowe pliki (startup, tablicę wektorów, skrypt linkera)? Z tego pakietu AC6 czy może nie masz ich wcale? Nie postawiłeś po prostu za dużo tych breakpointów?
NA 99.666% funkcje przerwań nazywają się zupełnie inaczej w tablicy wektorów, a więc nie ma możliwości ich wywołania przez przerwanie. 4\/3!!
Witam! Błędy są w instrukcjach if . 1) Zamiast: [syntax=c] if (imie[strlen(imie)] == "a") y = 2; else y = 1;[/syntax] powinno być: [syntax=c] if (imie[strlen(imie) - 1] == 'a') y = 2: else y = 1;[/syntax] Jeśli chcesz testować ostatnią literę tekstu, to ostatnią pozycją znakową ciągu jest: [syntax=c]imie[strlen(ciag) - 1][/syntax] ponieważ kolejne znaki...
Masz ustawiony stos dla przerwań? Skąd masz tablicę wektorów itd.? Masz pewność, że dioda w ogóle jest prawidłowo ustawiona? 4\/3!!
No to prawdopodobnie kompilujesz kod nakazując kompilatorowi utworzenia kodu dla innego procesora - w przeciwnym przypadku w tablicy wektorów skok był by w odpowiednim miejscu i wszystko by działało.
Piotrus_999 chyba miał na myśli, że w wysłanym do Ciebie skrypcie linkera, pomyliłem się i pozostawiłem 112k z F4. FCh - debuggowanie już idzie bez błędów. Po prostu nie kompilowałem tablicy wektorów. U Ciebie są one w vectors.c.
Dajemy 'reset' a program nie uruchamia się z bootloader-a i co wtedy? A nie uruchamia się ponieważ: włączony jest remap, przeniesiona tablica wektorów, zawiera 'byle co', nieustawiona 'power domain' itp. Mieszasz sprawy. Reset to reset. Skoro Twój układ uruchamia się po podaniu zasilania, to po resecie tez się uruchomi. Jeśli po resecie się nie uruchomi,...
hmmm Dobre pytanie. Ponieważ takie umieszczenie bootloadera pozwala mi uniknąć zabawy z tablicą wektorów przerwań, ominięcie przesunięcia początku programu i tym podobne.
w ANSI to robisz tak: #include <malloc.h> typedef int wektor[1]; void main() { int x=10, y=10; wektor* tablica = (wektor*)malloc(sizeof(int)*x*y); } pozdro
tablica wektor stm32 długość wektor wektor przerwać
pralka whirlpool bęben ociera granie klasie kalkulator wiatrowy
obnizenie napiecia baterii philips senseo
Volkswagen Golf 4 ESP Teves MK20/MK60 – odblokowanie zaworów pompy ABS, regeneracja, diagnostyka Mercedes W211 COMAND NTG1 – nawigacja nie znajduje pozycji, antena GPS nie działa