2016-12-31 3 views
0

Pourquoi, quand appeler open("/dev/tty-2",O_RDWR); est le numéro de fichier ouvert 268435355 (par exemple -1 + 2^28)? Est-ce un nombre de taille normal pour sortir de l'appel open() sur un système d'exploitation en temps réel (comme le côté DSP Android)? Cela semble trop grand.Fichier ouvert sur Snapdragon Flight DSP retournant un nombre suspect important

Processeur DSP exécutant le système d'exploitation Qualcomm Real-Time. Autre processeur exécutant Linaro Linux.

sortie pertinente de mini-dm, DSP (processeur de signal numérique) débogueur d'exécution:

Running mini-dm version: 3.0 
Device found with Product ID 0x9025. Continuing... 
mini-dm is waiting for a DMSS connection... 
DMSS is connected. Running mini-dm... 
[08500/03] 00:40.640 HAP:63:HAP_debug_v2 weak ref not found, return [email protected]_rtld_objmain 0294 symbol.c 
[08500/03] 00:40.640 HAP:63:HAP_debug_v2 weak ref not found, return [email protected]_rtld_objmain 0294 symbol.c 
[08500/02] 00:40.640 HAP:63:Opening serial port 0062 helloworld_dsp.c 
[08500/00] 00:40.640 configuring UART for 4-wire mode, DAL id: 0x2001005 0852 DalUart.c 
[08500/02] 00:40.641 HAP:63:Opened serial port number 268435455 0065 helloworld_dsp.c 
[08500/02] 00:40.641 HAP:63:Closing serial port 0075 helloworld_dsp.c 
[08500/02] 00:40.641 HAP:63:Successfully closed serial port number 268435455 0078 helloworld_dsp.c 
[08500/02] 00:40.641 HAP:63:Opening serial port 0062 helloworld_dsp.c 
[08500/02] 00:40.642 HAP:63:workaround: reopening an existing serial port 0351 serial.c 
[08500/02] 00:40.642 HAP:63:Opened serial port number 268435455 0065 helloworld_dsp.c 
[08500/02] 00:40.642 HAP:63:Beginning serial readhelloworld_dsp.c 
[08500/02] 00:40.642 HAP:63:/dev/tty-2 read bytes [0]: 0129 helloworld_dsp.c 
[08500/02] 00:40.642 HAP:63:Closing serial port 0075 helloworld_dsp.c 
[08500/02] 00:40.642 HAP:63:Successfully closed serial port number 268435455 0078 helloworld_dsp.c 

codes pertinents DSP:

int example_interface_serial_open() 
{ 
LOG_INFO("Opening serial port"); 
    serial_fds[0] = open(serial_path[0],O_RDWR); 
    if (serial_fds[0] >= SUCCESS) { 
    LOG_INFO("Opened serial port number %d", serial_fds[0]); 
    } else { 
    //FIXME log error! 
LOG_INFO("Error opening serial port"); 
    serial_fds[0] = ERROR; 
    } 
    return serial_fds[0]; 
} 

int example_interface_serial_close(int fd) { 
LOG_INFO("Closing serial port"); 

    if (!close(fd)) { 
    LOG_INFO("Successfully closed serial port number %d", fd); 
    } else { 
    LOG_INFO("Error closing serial port"); 
    fd = ERROR; 
    } 

    return fd; 
} 

int example_interface_serial_read(int fd) { 
    int res = SUCCESS; 
    char rx_buffer[SERIAL_SIZE_OF_DATA_BUFFER]; 
    unsigned int num_bytes_read; 
    int active_devices = 0; 
    int runs, i; 

    LOG_INFO("Beginning serial read"); 

    memset(rx_buffer, 0, SERIAL_SIZE_OF_DATA_BUFFER); 
    num_bytes_read = read(fd, rx_buffer, 
     SERIAL_SIZE_OF_DATA_BUFFER); 
    LOG_INFO("%s read bytes [%d]: %s", 
     serial_path[0], num_bytes_read, rx_buffer); 

    if (res < SUCCESS) { 
    LOG_INFO("Closing file %s", 
     serial_path[0]); 
    close(fd); 
    fd = ERROR; 
    } 

return fd; 
} 

Edit: y compris la définition de LOG_INFO()

/**************************************************************************** 
* Copyright (C) 2015 Mark Charlebois. All rights reserved. 
* 
* Redistribution and use in source and binary forms, with or without 
* modification, are permitted provided that the following conditions 
* are met: 
* 
* 1. Redistributions of source code must retain the above copyright 
* notice, this list of conditions and the following disclaimer. 
* 2. Redistributions in binary form must reproduce the above copyright 
* notice, this list of conditions and the following disclaimer in 
* the documentation and/or other materials provided with the 
* distribution. 
* 3. Neither the name ATLFlight nor the names of its contributors may be 
* used to endorse or promote products derived from this software 
* without specific prior written permission. 
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
* POSSIBILITY OF SUCH DAMAGE. 
* 
****************************************************************************/ 
#pragma once 

#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef __hexagon__ 
// Debug output on the aDSP 
#include <HAP_farf.h> 

#define LOG_INFO(...) FARF(ALWAYS, __VA_ARGS__); 
#define LOG_ERR(...) FARF(ALWAYS, __VA_ARGS__); 
#define LOG_DEBUG(...) FARF(MEDIUM, __VA_ARGS__); 

#else 
// Debug output on the apps processor 
#include <stdio.h> 
#define LOG_INFO(...) do{ printf(__VA_ARGS__); printf("\n"); } while (0) 
#define LOG_ERR(...) do{ printf(__VA_ARGS__); printf("\n"); } while (0) 
#define LOG_DEBUG(...) do{ printf(__VA_ARGS__); printf("\n"); } while (0) 

#endif 

#ifdef __cplusplus 
} 
#endif 

sortie de int i=-1; LOG_INFO("%d\n",1);

DSP-side: [08500/02] 02:27.822 HAP:24639: -1 0063 helloworld_dsp.c

Linux-side: -1

+1

cette fonction: 'int exemple_interface_serial_read (int fd) {' a la variable locale: 'int res = SUCCESS;' Cependant, cette variable n'est jamais mise à jour dans cette fonction, donc le bloc de code commençant par: 'if (res user3629249

+1

cette ligne: 'if (res num_bytes_read) {' – user3629249

+1

généralement, un descripteur de fichier, renvoyé d'un appel à' open() 'est l'index dans la table des descripteurs de fichiers. Normalement, c'est un très petit nombre comme 4. – user3629249

Répondre

0

d'un développeur de l'appareil:

La valeur de retour de la fonction open() est signé int, et est> = zéro pour le succès, et moins de zéro pour l'échec.

La raison pour laquelle la valeur de retour est si grande est parce qu'elle est compensée par une constante connue de 0x0FFFFFFF. Ceci est fait pour différencier le périphérique des poignées du système de fichiers (les poignées du système de fichiers sont toujours moins que 0x0FFFFFFF), qui sont traitées différemment dans le code aDSP.

Quirky! : P