segmentfejl

Få hjælp til at sætte programmer eller funktioner op.
oz6oh
Indlæg: 16
Tilmeldt: 15. jan 2011, 21:42

segmentfejl

Indlæg af oz6oh »

Kode: Vælg alt

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#define base 0x378 

main(int argc, char **argv)
{
 float x;
int value;
//start: //
 int int_round(double n) // afrunding
   return (n > 0.0) ? (n + 0.5) : (n -0.5);
}

start:
      printf(" freq som 144.000 in spring på 25KHz ");
      scanf("%f",&x);
   x = int_round((x - 140.8) * 40.0); /* beregning */
      printf("portdeling= %f\n",x);  /* Vist tal som vil ligge mellem 128.000 til 208.000  ialt 80 kanaler */
      value = (int) x;
   outb(value,base);

  goto start;
}

Ved kørsel får jeg en segmentfejl .Jeg er interesseret i at kunne kalde min lpt port 378 Hvordan retter jeg det ?
Ideen er at min lptport skal styre en 2 meter station fra 144 til 146 MHz
På en eller anden måde skal x ændres så lpt bliver aktiveret

Jeg kører Ubuntu 10.10 med stor glæde Venligst ole Hasselbalch oz6oh alias oz7t
http://www.olehasselbalch.dk
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: segmentfejl

Indlæg af lath »

Hej Ole

Jeg har også været radioamatør - OZ5AFW - engang, men nu er jeg inaktiv.


Først og fremmest skal dit program snakke med en device driveren.

Programmet kan ikke snakke med hardware på nogen anden måde, og programmet kan heller ikke bestemme hardware detaljer (lpt port 378).

Der findes nogle device drivers til at styre HAM radio elektronik.

Der er en fejl i din første funktion.
Den får inddata i double typen, regner i double typen, og returnerer også en double, selv om du siger at den er en int, for du har glemt at type caste retur værdien.

Du har heller ikke giver variablerne i main en startværdi., og så ved du ikke hvad de rent faktisk indeholder.


Du koder også lidt mærkeligt, man bruger (normalt) ikke goto - det er dårlig kode stil. goto kan man finde på at bruge i en linux device driver for at ungå et nested-if helvede, som giver uoverskuelig kode.

Det kan så være at du ikke kender til while(1) tricket, så jeg har skrevet din kode om til noget kønnere:

Kode: Vælg alt

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>

#define BASE 0x378

static int int_round(double n);
static int main(int argc, char **argv);

static int main(int argc, char **argv)
{
float x;
int value;

while(1) {
  printf(" freq som 144.000 in spring på 25KHz ");
      scanf("%f",&x);
   x = int_round((x - 140.8) * 40.0); /* beregning */
      printf("portdeling= %f\n",x);  /* Vist tal som vil ligge mellem 128.000 til 208.000  ialt 80 kanaler */
      value = (int) x;
   outb(value,BASE);
}

}

static int int_round(double n) { // afrunding
   int ret_val = (int) ( (n > 0.0) ? (n + 0.5) : (n -0.5));
   return ret_val;
}


og outb virker så ikke. (kig lige i edit nederst i det her indlæg)

Hvis du lige kan vise et schematic (elektronik diagram), over din styring, og komme med nogle kommentarer til den til de ting der er ikke er indlysende, kan jeg finde ud af hvilken device driver dit program skal bruge.

Lige i forbindelse med det her kan det være rart at vide for dig at jeg er IT ingeniør med specialisering i Teknisk IT og Embedded Systems(Indlejrede systemer), og jeg var 1 af de 2 ud af 26 i vores ingeniør-klasse der er god til elektronik.
Så du må gerne blive meget teknisk - jeg skal nok sige til når kæden hopper af (det gælder mest når det kommer til RF design af elektronik.)

Er det nødvendigt kan jeg lave et lille indlejret system, der kan snakke med serielport device driveren i kernen, og så kan dit program snakke med det indlejrede systems microcontroller via den device driver.

Edit:
Nå så du er ved at lave en user space device driver, eller hva'?
Hvis ja, så læg mærke til at der skal bruges en bare-bone device driver i kernen til at rå-kopiere data til og fra elektronik/mikrocontrolleren.
Er du heldig er der nogen der har lavet den i forvejen.

der er en insterressant funktion som hedder ioperm, og om den står der "Controls access to the first 0x3FF I/O ports".

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

User space device drivers

Indlæg af lath »

Her er link til hvor du kan se hvordan vgalib user-space device driveren er stykket sammen:
http://tldp.org/LDP/khg/HyperNews/get/devices/fake.html

Det er basalt set nogle ioperf og memory mapping på /dev/mem (et vindue til RAM) man laver i sit program med superbruger-rettigheder, hvorefter programmet har lov til at skrive og læse de steder hvor man har bedt om direkte adgang til den fysiske hukommelse.
Der er begrænsninger på hvad man kan lave med den metode, men det skulle række rigeligt til dit formål.

Det kan derudover være at du får brug for at black liste parallel port (kerne) device driveren, så der ikke opstår race conditions.
Opstår der raceconditions, så tag først driveren ud af drift med rmmod, og tilføj derefter driveren til /etc/modprobe.d/blacklist.conf filen.
Formatet i den fil er:

Kode: Vælg alt

blacklist <device_driver_navn>

på en seperat linie

Hvis du vil kigge i dokumentationen/kilde koden fra kernel.org, så har du brug for at kigge i LXR, eller i indholdet af den tar fil du kan downloade fra http://www.kernel.org. Tar filen skal først dekomprimeres.
Du skal kigge i (relativ sti i forhold til udpakket tar fil, og LXR/source):

tmpl filen er skrevet i DocBook format, så du kan bruge Makefile fra den samme mappe til at lave en PDF. Husk lige at installere de værktøjer make bruger.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
oz6oh
Indlæg: 16
Tilmeldt: 15. jan 2011, 21:42

Re: segmentfejl

Indlæg af oz6oh »

Jeg har med glæde læst svaret, og har da også prøvet at køre det c-program du medsendte. Det virker nu ikke, men while kommer med i næste omgang. Jeg skriver forresten også at goto kun bør bruges i ganske små oversigtlige programmer. Jeg er autodidakt og har aldrig lært at programmere, men i sin tid lykkedes det mig da at få lavet nogle glimrende programmer af samme slags som jeg nu beskæftiger mig med.
Dengang brugte jeg PPAS samt TURBOPASCAL. De var ret gode og virkede dengang sammen med PACKETRADIO. Dette findes jo ikke mere. Jeg sender dig lige de program jeg selv er nået frem til. Det kører perfekt.

Kode: Vælg alt

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#define base 0x378 

main(int argc, char **argv)
{
 float x;
 int value;
  int int_round(double n) // runde n zu einem in   
  {
        return (n > 0.0) ? (n + 0.5) : (n -0.5);
  }

  if (ioperm(base, 3, 1)) {perror("ioperm"); exit(1);} //Nur mit sudo ./y

  start:
      printf(" freq als 144.000 in Sprung von 25KHz ");
      scanf("%f",&x);
      value = int_round((x - 140.8) * 40.0); /* berechnung */
      printf("portteilung= %d\n", value);  /* anzeige */

      outb(value, base);

  goto start;
// GOTO er ikke god latin men med dette lille program ok//
}

Og i terminal ser det sådan ud:
ole@ubuntu:~/Skrivebord$ sudo ./y
[sudo] password for ole:
freq als 144.000 in Sprung von 25KHz 144
portteilung= 128
freq als 144.000 in Sprung von 25KHz 144.025
portteilung= 129
freq als 144.000 in Sprung von 25KHz 145
portteilung= 168
freq als 144.000 in Sprung von 25KHz 145.050
portteilung= 170
freq als 144.000 in Sprung von 25KHz 145.975
portteilung= 207
freq als 144.000 in Sprung von 25KHz 146
portteilung= 208
freq als 144.000 in Sprung von 25KHz


Som du ser får jeg de rigtige delinger og min sender funker. Dog skal der nu både while samt sikkerhed for at jeg kun kan holde mig inden for båndgrænserne. Dette er kun en start. Der kommer meget mere på.
Ole oz6oh
AJenbo
Admin
Indlæg: 20884
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: segmentfejl

Indlæg af AJenbo »

Det er en god ide at sætte en kode kasse omkring ens kode, ellers risikere du at der kommer smilies i den og den bliver ikke så let at læse.
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: segmentfejl

Indlæg af lath »

Hej ole

Jeg skriver lidt simplere her, fordi jeg ved at der nogle der læser med i tråden - bare så du ved det.

Det glæder mig at du kunne bruge min information :D
Informationerne er - indrømmet - ret meget op af bakke, men det virker nu ikke som du er blevet skræmt af dem.

sudo ./y
Du kan køre programmet setuid root - altså starte programmet op med root rettigheder uden at skulle bruge sudo.
Det gør du sådan her med programmet y i denne mappe:

Kode: Vælg alt

sudo chown root ./y;sudo chmod u+x ./y; sudo chmod u+s ./y

efter den svada er root ejer af filen, eXecute bitten er sat (u+x), og SET UID bitten er sat (u+s)

Kun programmer som oversættes til maskinkode kan afvikles SET UID root. Kernen er programmeret til kun at køre SET UID scripts med almindelige rettigheder (altså de kræver stadig sudo, selv om de har SET UID bitten sat).

Det kan naturligvis fikses ved at man koder en lille wrapper i C, som straks kører et exe* ->fork->wait systemkalds sekvens. Wrapper programmet kan så starte SET UID root, og fordi det program så har root rettigheder kører det også et script med root rettigheder - uden at kræve sudo/su/gksudo/gksu.

Elektronik:
Du må gerne lige vise et schematic af din hardware - jeg går ud fra at den styrer en transistor der trigger et relæ, som starter senderen.

Hvis der er et relæ bør du have en lavohms modstand i serie med en diode i spærreretningen parallelt over transistoren for at dræbe spændinger fra spolen, der kan lave gennemslag.

Jeg ville også isolere computeren med en optokobler for at undgå at brænde elektronik af i computeren.
Jeg er være bekymret for nordbroen der har mange I/O pins.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
oz6oh
Indlæg: 16
Tilmeldt: 15. jan 2011, 21:42

Re: segmentfejl

Indlæg af oz6oh »

Lars ex radioamatør håber du får din licens igen
Jeg bruger en NPN til relæ og ALT er jordet hos mig. Til og med sætter jeg altid en ledning med krokodiller mellem de to genstande ved sammenkobling, men med et DB25 stik skabes forbindelsen selv
Din sudo chown root ./y;sudo chmod u+x ./y; sudo chmod u+s ./y
Har jeg prøvet, og er nu i gang med while i min source
Ole