PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Adresse über Kommandozeile übergeben



keinWort
06-09-2005, 13:28
Hallo,

ich benötige für einen Watchdog ein Programm, das eine Speicheradresse immer wieder überschreibt (sollte die Adresse nicht mehr überschrieben werden wird der Rechner neugestartet).
Ich wollte also ein Programm schreiben, welches über die Kommandoezile eine Adresse übergeben bekommt. Leider ist der Übergabewert ein char.

Ich dachte mir das Folgendermaßen. Das Programm bekommt die Adresse über die Kommandozeile und speichert sie in einem Pointer. Über den kann ich dann die Adresse überschreiben.



int main(int argc, char *argv[])int main(int argc, char *argv[])
{
int eins[10];
int i=0;
char * adress; //Pointer
if(argc==1)
{
cout << "zu wenig Parameter" << endl;
}
else
{
cout << "Speicheradresse " << argv[1] << "" << endl;
adress = argv[1];
cout << adress << endl;
cout << *adress << endl;
}

system("PAUSE");
return EXIT_SUCCESS;
}


Was ist in meinem Code falsch bzw. wie geht sowas. :confused:

panzi
06-09-2005, 14:03
willst dui das haben?


int main(int argc, char *argv[])int main(int argc, char *argv[])
{
int eins[10];
int i=0;
char * adress; //Pointer
if(argc==1)
{
cout << "zu wenig Parameter" << endl;
}
else
{
cout << "Speicheradresse " << argv[1] << "" << endl;
adress = argv[1];
cout << adress << endl;
cout << (unsigned int)adress << endl;
// oder event.:
cout << "0x" << hex << (unsigned int)adress << endl;
}

system("PAUSE");
return EXIT_SUCCESS;
}

anda_skoa
06-09-2005, 14:16
ich benötige für einen Watchdog ein Programm, das eine Speicheradresse immer wieder überschreibt (sollte die Adresse nicht mehr überschrieben werden wird der Rechner neugestartet).

Dir ist hoffentlich klar, daß du nur in den Speicherbereich des eigenen Prozesses schreiben kannst.

Ciao,
_

keinWort
07-09-2005, 08:07
Ich muss wohl erklähren wozu ich das brauche.

Wir habe einen Rechner der über einen Hardware-watchdog gesteuert wird. Will heißen, sobald sich der Wert in einem Speicherbereich nicht mehr ändert wird der Rechner neu gestartet.

Ich brauche also ein Programm, das sich einen bestimmten Speicherbereich zusichert (Eben den des Watchdog, der ja nicht zu OS gehört) und darin der Wert ständig ändert.

Kann man das in C++ überhaupt?

SeeksTheMoon
07-09-2005, 10:57
Du kannst es mit shared memory versuchen:
http://www.pronix.de/pronix-229.html

C++ wird Dir da zwar nichts nützen, aber C dürfte ja kein Problem sein.

r00t043
07-09-2005, 10:58
Ein Programm bekommt immer einen eigenen virtuellen Adressraum und welche physikalischen Adressen das sind liegt frei in der Hand der MMU (memory managment unit). Und aufgrund der Sicherheit darf auch kein Prozess direkt auf den physikalischen Adressraum zugreifen.
Deswegen wirst du wohl ein Kernelmodul schreiben muessen, das das macht.

keinWort
07-09-2005, 11:07
Ich wollte nur sagen, dass die Kiste unter WindowsXP läuft, ändert das irgengwas an den grundsätzlichen Aussagen? :confused:

SeeksTheMoon
07-09-2005, 11:54
Ja, das bedeutet dass Du nachsehen musst ob Windows irgendwie den Speicherzugriff erlaubt. Wenn Du Pech hast, musst Du einen Treiber schreiben (ka wie das geht).

Wie ist denn der Watchdog aufgebaut? Ich habe einen der vom Rechner Strom bekommt, welcher einen Kondensator auflädt.
Wenn der voll ist, wird der Reset ausgelöst, außer der Rechner schickt ein Signal auf die Platine des WD, dass der Kondensator entladen wird und der Reset dadurch verhindert wird.

So eine Lösung kommt ganz ohne gemeinsame Speicherbereiche usw. aus, man schickt einfach nur regelmäßig Impulse über eine Datenleitung (z.B. serielle Schnittstelle in diesem Fall)

Worauf ich hinaus will: vielleicht kann Dein WD auch anders angesteuert werden.

anda_skoa
07-09-2005, 13:31
Es kann sein, daß die Adresse Teil des gemappten IO Bereichs ist, also zwar wie ein Teil des Arbeitsspeichers aussieht, aber in Wirklichkeit in der Zusatzhardware ist.

Sowas geht üblicherweise schon, sofern man das Programm mit ausreichenden Rechten laufen läßt.

Ciao,
_

keinWort
07-09-2005, 14:18
In der Anleitung zu diesem Rechner steht:


The watchdog needs to be triggered out of the application software within a specified timeout period. You can only do this in the application software by using low-level programming or with help of the JIDA programmer’s interface.

Dieses "JIDA programmer’s interface" ist wohl bei diesem Rechner dabei und mit "low-level programming" meinen die wohl Assembler :eek: .

Pingu
07-09-2005, 14:35
Dieses "JIDA programmer’s interface" ist wohl bei diesem Rechner dabei und mit "low-level programming" meinen die wohl Assembler :eek: .
Der Programmierlevel hat nichts mit der Programmiersprache zu tun. Der Programmierlevel heißt, z. B. Betriebssystemebene vs. Anwendungsebene - bei Linux wäre die Betriebssystemebene ein Kernel-Modul, bei Windows ein Treiber.

Die Programmiersprache hat damit nichts zu tun. Sicherlich kann man das in Assembler machen, aber auch in C oder C++ oder was auch immer, wenn der entsprechende Compiler und die Bibliotheken zur Verfügung stehen. Meistens trifft dies jedoch nur auf C bzw. ANSI C zu.

Hier steht was zum JIDA-Interface: http://www.dpie.com/dimmpc/wince.html

Pingu

keinWort
07-09-2005, 14:49
Ich habs schon gefunden.

Auf der Herstellerseite kann man sich 'ne JIDA32 API runterladen. Ich habe so den Verdacht, dass ich bald mal wieder auf der Matte stehen werde.

Aber trotzdem danke.