Skocz do zawartości

ARM - debugowanie, podgląd funkcji


Pomocna odpowiedź

Napisano

Siemka 😉!

Chciałbym zobaczyć, jaki będzie wynik funkcji eCompareString. Używałem "Watch 1", ale nwm czy może on sobie poradzić z taką funkcją która zwraca return? W każdym razie mi się to nie udało. Próbowałem też wpisywać samą nazwę funkcji w Command Window, ale to też nic nie dało. Próbowałem szukać odpowiedzi też tutaj Forum Keil, ale nie znalazłem - choć tam też zadałem to pytanie 🙂. Jakby ktoś chciał zaglądnąć to tutaj: Post Keil

Sprzęt - ARM LPC2132

IDE - qVision4 Keil

#include <LPC21xx.H>
#include <string.h>

#define NULL 0

enum CompResult{DIFFERENT, EQUAL};

enum CompResult eCompareString(char pcStr1[], char pcStr2[]){

       unsigned char ucCounter;

       for(ucCounter=0; pcStr1[ucCounter]==pcStr2[ucCounter]; ucCounter++){
               if(pcStr1[ucCounter]==NULL){
                       return EQUAL;
               }
       }
       return DIFFERENT;
}

int main(){

       char pcStr1[] = {'a','b','c', NULL};
       char pcStr2[] = {'d','e','f', NULL};

       eCompareString(pcStr1, pcStr2);

       return 0;
}

Z góry dzięki za odpowiedź 😉!

Gość es2

W kodzie, który pokazałeś nie zobaczysz co zwraca funkcja bo nie zwraca nic. Nie używasz zwracanej wartości więc optymalizator "wywala" fragment odpowiedzialny za to.

es2

Wobec tego co powinienem dopisać w kodzie? Przypisać coś (EQUAL/DIFFERENT) do zmiennej i później w main() ją wywołać ?

Gość es2
es2

Wobec tego co powinienem dopisać w kodzie? Przypisać coś (EQUAL/DIFFERENT) do zmiennej i później w main() ją wywołać ?

Dokładnie. Ponadto jeszcze optymalizator może robić w konia. Jak tylko przypiszesz a dalej zmiennej nie bedziesz używał optymalizator to wywali. Zmienna może też być trzymana w rejestrach.

Przypisuj więc do zmiennej static volatile albo globalnej volatile.

es2

Napisałem coś takiego dla C - wrzuciłem w internetowy kompilator, jest ok.

#include <stdio.h>
#include <string.h>

#define NULL '\0'

enum CompResult{DIFFERENT, EQUAL};

enum CompResult eCompareString(char pcStr1[], char pcStr2[]){

       unsigned char ucCounter;

       for(ucCounter=0; pcStr1[ucCounter]==pcStr2[ucCounter]; ucCounter++){
               if(pcStr1[ucCounter]==NULL){
                       return EQUAL;
               }
       }
       return DIFFERENT;
}
int main(){

       char pcStr1[] = {'a','b','c', NULL};
       char pcStr2[] = {'a','b','d', NULL};

   printf("Resullt: %d\n", eCompareString(pcStr1, pcStr2));

   return 0;

}

Później napisałem dla C++, działa:

#include <iostream>
using namespace std;

#define NULL 0

enum CompResult{DIFFERENT, EQUAL};

enum CompResult eCompareString(char pcStr1[], char pcStr2[]){

       unsigned char ucCounter;

       for(ucCounter=0; pcStr1[ucCounter]==pcStr2[ucCounter]; ucCounter++){
               if(pcStr1[ucCounter]==NULL){
                       return EQUAL;
               }
       }
       return DIFFERENT;
}
int main(){

   char pcStr1[] = {'a','b','c', NULL};
   char pcStr2[] = {'a','b','d', NULL};

   cout << "Result: " << eCompareString(pcStr1, pcStr2) << endl;

   return 0;

}

A jak wrzucam do Keil'a. To gdy chce debugować (ctrl + F5), to nie mogę tego zrobić dla "main.c" - to się wywala zawsze, gdy używam w Keil'u:

...
#include <stdio.h>
...
printf("...", ...);
...

To co wrzuciłem do Keil'a tutaj:

#include <LPC21xx.H>
#include <stdio.h>
#include <string.h>

#define NULL 0

enum CompResult{DIFFERENT, EQUAL};

enum CompResult eCompareString(char pcStr1[], char pcStr2[]){

       unsigned char ucCounter;

       for(ucCounter=0; pcStr1[ucCounter]==pcStr2[ucCounter]; ucCounter++){
               if(pcStr1[ucCounter]==NULL){
                       return EQUAL;
               }
       }
       return DIFFERENT;
}

int main(){

   char pcSource[] = {'a','b','c', NULL};
   char pcDestination[] = {'d','e','f', NULL};

   CopyString(pcSource, pcDestination);

   printf("Result: %d\n", eCompareString(pcStr1, pcStr2));
Gość es2

Spróbowałbym

char CompResult{DIFFERENT, EQUAL};

Zamiast

enum CompResult{DIFFERENT, EQUAL};

O co chodzi z tym wywalaniem?

to nie mogę tego zrobić dla "main.c" - to się wywala zawsze, gdy używam w Keil'u:
    char CompResult{DIFFERENT, EQUAL};

to jakaś nowa konstrukcja w C?

program się wywala bo printf() nie działa na docelowym urządzeniu. Musisz przekierować wyjście, inaczej program "nie wiem" gdzie miałby te dane wypisać.

Gość es2
    char CompResult{DIFFERENT, EQUAL};

to jakaś nowa konstrukcja w C?

Nie ta linijkę skopiowałem

char CompResult eCompareString(char pcStr1[], char pcStr2[])

ethanak, chodziło mi o to cudo:

char CompResult

Koleś wypisuje że jest mega gwiazdą Elektroniki Praktycznej - a wygląda na to, że nie zna podstaw C. Ale może się mylę, więc delikatnie pytam. Chociaż na szczęście i tak EP od dawna nie kupuję, ale teraz chociaż wiem dlaczego.

Elvis

Czy wiesz może jak przekierować wyjście, aby można było korzystać z printf()? Szukam w necie, ale na razie nie natrafiłem na to jeszcze 🙁

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...