Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: ArifAhmet - 03 Ağustos 2015, 07:34:38

Başlık: Fonksiyonu tekrar çağıramıyorum
Gönderen: ArifAhmet - 03 Ağustos 2015, 07:34:38
Merhabalar,
Elimde şöyle bir fonksiyon var.


int gpioCmdParse(int argc, char** argv){
int mode_flag = 0;
      GPIO_InitTypeDef GPIO_InitDef;
      GPIO_TypeDef* gpioName;
char portName;
char readValue[16];
char* pin_number;

int option_index = 0;
      int c;
     
     
      while(1){
      c = getopt_long_only(argc, argv, "m:n:p:o:t:r:s:", gpio_cmd, &option_index);

      // Detect the end of the options.
      if (c == -1)
        break;

    switch (c){
        case 'm':
            if(!strcmp(optarg,MODE_INIT))
          mode_flag = 1;
          else if(!strcmp(optarg,MODE_WRITE))
            mode_flag = 2;
          else if(!strcmp(optarg,MODE_READ))
            mode_flag = 3;
          else{
            //error
          }
          break;
        case 'n':
        portName = optarg[0];
          break;
        case 'p':
            GPIO_InitDef.GPIO_Pin = getPin(optarg);
          pin_number=optarg;
          break;
        case 'o':
          GPIO_InitDef.GPIO_OType = getOtype(optarg);
          break;
        case 't':
          GPIO_InitDef.GPIO_Mode = getMode(optarg);
          break;
        case 'r':
          GPIO_InitDef.GPIO_PuPd = getPuPd(optarg);
          break;
        case 's':
          GPIO_InitDef.GPIO_Speed = getSpeed(optarg);
          break;
        case '?':
          // getopt_long already printed an error message.
          break;
        default:
          break;
        }
    }
switch(portName){
        case cmdGPIOA:
            RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
            gpioName = GPIOA;
            break;
        case cmdGPIOD:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
gpioName = GPIOD;
            break;
        case cmdGPIOG:
            RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
            gpioName = GPIOG;
            break;
        default:
            //error
            break;
    }
    switch(mode_flag){
        case 1:
      GPIO_Init(gpioName, &GPIO_InitDef);
  chPrintln(CH_GPIO_INIT);
//GPIO_SetBits(gpioName, getPin(pin_number));
      break;
    case 2:
      GPIO_SetBits(gpioName, getPin(pin_number));
chPrintln(CH_GPIO_WRITE);
      break;
    case 3:
      sprintf(readValue,"Value = %d\n",GPIO_ReadInputDataBit(gpioName, GPIO_InitDef.GPIO_Pin));
      chPrint(readValue);
      break;
  }
 
return 0;
}


ve şu şekilde çağırıyorum;

        gpioCmdParse(10,argv);
gpioCmdParse(10,argv2);


İlk çağırmamda GPIO initialize yazısını ekranda görüyorum (bu arada stm32f429 kullanıyorum). Fakat 2. fonksiyonu çağırmıyor. Yani ekranda hiçbirşey görünmüyor (görünmesi gereken "GPIO Write"). argv2 parametresini alan fonksiyonu başa alıp tekrar yüklediğimde bu sefer "GPIO Write" yazısını alıyorum fakat 2. kez çağırdığım fonksiyon yine çalışmıyor. Pointer'lar ile ilgili bir sorun olduğunu düşünüyorum.
Yardımcı olabilirseniz çok sevinirim.

İyi çalışmalar.
Başlık: Ynt: Fonksiyonu tekrar çağıramıyorum
Gönderen: pea - 03 Ağustos 2015, 14:33:19
while(1){
      c = getopt_long_only(argc, argv, "m:n:p:o:t:r:s:", gpio_cmd, &option_index);

      // Detect the end of the options.
      if (c == -1)
        break;
  }
 
        return 0;


c == -1 olmadan fonksiyondan dönme şansınız yok.
Başlık: Ynt: Fonksiyonu tekrar çağıramıyorum
Gönderen: RaMu - 03 Ağustos 2015, 21:07:33

int c;

Kullanılan derleyici "int" için ne tanımlıyor acaba?

Ben bunların yerine hep tam olarak ne ise öyle tanımlıyorum,
signed int8 c=0; gibi,
hatta her zaman ilk değer vermeyede özen gösteriyorum.