struct problem / serielle Schnittstelle
-
Hallo,
hab gerad ein paar probleme mit einer typedef struct.
In einer Headerdatei hab ich eine typdef struct deklariert
typedef struct meineStruct{ unsigned char Data; }struct_def;
In meinem dazugehörigen C-file hab ich ein Array dieses Structs global definiert
struct_def tabelle[number];
Innerhalb einer Funktion dieses C-files möchte ich gerne auf diese Tabelle zugreifen.
struct_def *p_struct; p_struct = &tabelle[0];
Zwar bringt der Compiler keine Fehlermeldung und wenn ich das Programm kombiliere und im Debug Modus laufen lasse - läuft es auch... Jedoch funktioniert dann die serielle Schnittstelle nicht... -> bekomme keinerlei ausgaben angezeigt.
wenn ich das Array innerhalb dieser Funktion deklariere, funktioniert das Programm mit Ausgabe über die serielle Schnittstelle.
Wo könnte hier das Problem liegen?
derTim
-
Was genau hat denn dieses Array mit der seriellen Schnittstelle zu tun? (und wo wir gerade dabei sind, wie ist 'number' definiert?)
-
CStoll schrieb:
Was genau hat denn dieses Array mit der seriellen Schnittstelle zu tun? (und wo wir gerade dabei sind, wie ist 'number' definiert?)
das weiß ich auch nicht wie die beiden zusammenhängen - das ist ja das komische an der ganzen geschichte... ich arbeite mit einem mikrocontroller.
number ist in dem gleichen Headerfile wie die struct selbst definiert - jedoch vor der struct als define
#define number 4
derTim
-
Und ich hoffe für dich, daß du auch nur in diesem Bereich geblieben bist - die Elemente tabelle[0] bis tabelle[3] (3==number-1) sind gültig, alles dahinter gehört jemand anderem (bei dir möglicherweise der Schnittstellen-Steuerung).
-
CStoll schrieb:
Und ich hoffe für dich, daß du auch nur in diesem Bereich geblieben bist - die Elemente tabelle[0] bis tabelle[3] (3==number-1) sind gültig, alles dahinter gehört jemand anderem (bei dir möglicherweise der Schnittstellen-Steuerung).
mehr als einen Pointer auf den Beginn des Arrays zu setzen mache ich noch gar nicht - also ich greife bis jetzt nirgends im code auf die Werte von dem Array zu...
derTim
-
derTim schrieb:
mehr als einen Pointer auf den Beginn des Arrays zu setzen mache ich noch gar nicht - also ich greife bis jetzt nirgends im code auf die Werte von dem Array zu...
Seltsam - funktioniert denn die Schnittstelle noch, wenn du nur das Array anlegst (ohne den Zeiger)?
PS: Zeig mal bitte etwas zusammenhängenderen Code.
-
CStoll schrieb:
derTim schrieb:
mehr als einen Pointer auf den Beginn des Arrays zu setzen mache ich noch gar nicht - also ich greife bis jetzt nirgends im code auf die Werte von dem Array zu...
Seltsam - funktioniert denn die Schnittstelle noch, wenn du nur das Array anlegst (ohne den Zeiger)?
PS: Zeig mal bitte etwas zusammenhängenderen Code.
Ja wenn ich den Zeiger weglasse auf das Array, funktioniert die serielle Schnittstelle. Ansonsten wäre es möglich, dass das data segment zu klein ist... aber so...
Ich bekomm auch keinerlei Warnungen oder Fehlermeldungen angezeigt.
Bezüglich Code kann ich nicht alles zeigen: aber wie gesagt zuerst wird eine globale Variable Array vom struct erzeugt und anschließend kommen die C-Funktionen (lokal deklariert)
Innerhalb einer solchen lokalen Funktion wird ein Zeiger auf dieses Struct Array erzeugt. Mehr Code gibt es zu diesem struct Array nicht, weil ich es gerade versuche zu installieren (aber leider nicht ganz so funktioniert)
derTim
-
Sorry, hier hat wohl kaum jemand eine funktionstüchtige Kristallkugel (meine habe ich vor geraumer Zeit entsorgt, weil sie nichts brauchbares angezeigt hat :D) - und aus dieser Beschreibung könnte ich vielleicht etwas zusammenbauen, aber ich weiß nicht ob das Ähnlichkeiten mit deinem Problemprogramm hat. Also entweder du zeigst uns deinen Code oder du wirst wohl alleine nach Fehlern suchen müssen.
(das sollte keine Drohung sein, nur ein Hinweis)
-
CStoll schrieb:
Sorry, hier hat wohl kaum jemand eine funktionstüchtige Kristallkugel (meine habe ich vor geraumer Zeit entsorgt, weil sie nichts brauchbares angezeigt hat :D) - und aus dieser Beschreibung könnte ich vielleicht etwas zusammenbauen, aber ich weiß nicht ob das Ähnlichkeiten mit deinem Problemprogramm hat. Also entweder du zeigst uns deinen Code oder du wirst wohl alleine nach Fehlern suchen müssen.
(das sollte keine Drohung sein, nur ein Hinweis)
versteh ich auch nicht als Drohung - das ist mir schon klar... Nur am Code liegt es nicht... ich glaube eher, dass eine überschneidung im speicherbereich vorliegt.. hab gerade mal versucht das Array zu initialisieren mit irgendwelchen Werten -> und siehe da, die USART funktioniert ebenfalls nicht mehr... von daher wird hier das DataSegement doch zu klein sein...
Mal schaun wie ich das ändern kann..
derTim
-
derTim schrieb:
Mal schaun wie ich das ändern kann..
lass den linker ein mapfile generieren und schau mal, wo er die variablen hinpackt bzw. ob sich irgendwas übelappt. allerdings dürfte bei statisch definierten variablen jeder noch so schäbige linker inder lage sein, überlappungen bzw. segmentüberläufe zu erkennen und fehlermeldungen zeigen (vorausgesetzt er kennt die begrenzungen deines controllers, diese angaben solltest du vielleicht auch mal überprüfen).
ist deine serielle schnittstelle vielleicht interruptgesteuert?
-
Reine Buttermilch schrieb:
derTim schrieb:
Mal schaun wie ich das ändern kann..
lass den linker ein mapfile generieren und schau mal, wo er die variablen hinpackt bzw. ob sich irgendwas übelappt. allerdings dürfte bei statisch definierten variablen jeder noch so schäbige linker inder lage sein, überlappungen bzw. segmentüberläufe zu erkennen und fehlermeldungen zeigen (vorausgesetzt er kennt die begrenzungen deines controllers, diese angaben solltest du vielleicht auch mal überprüfen).
ist deine serielle schnittstelle vielleicht interruptgesteuert?
das array wird in der.bss section installiert; da es ja global definiert wird.
Einen Überlauf sollte der Compiler eigenltich erkennen.
Execution Region ER_ZI (Base: 0x00200054, Size: 0x0000518c, Max: 0xffffffff, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x00200054 0x00001800 Zero RW 101 .bss phy_init.o
0x00201854 0x00003500 Zero RW 125 .bss buf.o
0x00204d54 0x00000004 PAD
0x00204d58 0x00000488 Zero RW 1 STACK rm9200.oderTim
-
nein meine schnittstelle ist nicht interrupt-gesteuert.
-
derTim schrieb:
das array wird in der.bss section installiert; da es ja global definiert wird.
Execution Region ER_ZI (Base: 0x00200054, Size: 0x0000518c, Max: 0xffffffff, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x00200054 0x00001800 Zero RW 101 .bss phy_init.o
0x00201854 0x00003500 Zero RW 125 .bss buf.o
0x00204d54 0x00000004 PAD
0x00204d58 0x00000488 Zero RW 1 STACK rm9200.ovon dem array ist nix zu sehen, oder ist eines der beiden objekte im .bss das array? stimmen die einstellungen? beginnt dein RAM wirklich bei 0x00200054 und hört bei 0xffffffff auf? das wären irgendwie 4GB, scheint mir etwas viel zu sein, aber vielleicht missverstehe ich auch diese 'max' angabe. ansonsten: debuggen (single step, adressen, inhalte der variablen anschauen usw.)
-
über meine serielle schnittstelle bekomm ich grad garnichts mehr angezeigt... so als wenn sie tod wäre... hab auch mal ein ganz einfaches programm ausprobiert - aber nichts....
Weiß gar nicht wie man diese Schnittstelle software-mäßig komplett unbrauchbar machen kann.
derTim
-
derTim schrieb:
Weiß gar nicht wie man diese Schnittstelle software-mäßig komplett unbrauchbar machen kann.
das ist so gut wie unmöglich. was ist das für ein controller, den du da hast?
-
ein AT91RM9200 Controller ist das...
-
derTim schrieb:
ein AT91RM9200 Controller ist das...
ach so, ich kenne mich etwas mit at91sam7's aus. scheint das selbe u(s)art peripheral drauf zu sein. hehe, hab grade gelesen dass der auch kein IIC slave kann, aber egal, zeig doch mal, wie du den usart initialisiert hast.
übrigens: bei atmel-ARMs musste unbedingt die errata-sheets lesen, wegen der vielen hardware-bugs, die die dinger haben.
-
hab den usart1 genommen
AT91PS_USART COM1 = AT91C_BASE_US1; //pmc AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<<AT91C_ID_US1 ) ; //define RXD and TXD as peripheral AT91F_PIO_CfgPeriph(AT91C_BASE_PIOB,AT91C_PB21_RXD1 | AT91C_PB20_TXD1,0); //usart_config AT91F_US_Configure (COM1, MCK,AT91C_US_ASYNC_MODE, 115200, 0); //enable usart COM1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
das ist die ganze initialisierung vom usart1 - hab bis jetzt auch sehr gut funktioniert...
derTim
-
das sieht so weit auch ganz gut aus. nun zeig doch mal, wie du zeichen sendest...
-
das problem ist vll die hardware - ein widerstand hat sich auf seinen lötpads verschoben.... leider hab ich keinen schaltplan von diesem board um genau sagen zu können, wozu dieser widerstand da ist - befindet sich in der nähe des externen flash-ICs...
ich hab nämlcih zuvor mal probiert, leds anzuschalten - an gehen sie aber nur ganz kurz und dann sind sie wieder weg... obwohl sie eigentlich die ganze zeit an sein sollten
derTim