2016-12-31 2 views
0

Почему при вызове open("/dev/tty-2",O_RDWR); - номер открытого файла 268435355 (например, -1 + 2^28)? Является ли это нормальным номером для вывода из вызова open() в операционной системе реального времени (например, стороне Droid для Android)? Это кажется слишком большим.Файл открыт на Snapdragon Flight DSP, возвращающем подозрительно большое количество

Процессор DSP, работающий в режиме реального времени Qualcomm. Другой процессор под управлением Linaro Linux.

Соответствующая Выход из mini-dm, DSP (цифровой процессор сигналов) во время выполнения отладчик:

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 

Соответствующая 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; 
} 

Редактировать: в том числе определение 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 

Выход от int i=-1; LOG_INFO("%d\n",1);

DSP-сторона: [08500/02] 02:27.822 HAP:24639: -1 0063 helloworld_dsp.c

Linux, сторона: -1

+1

Эта функция: 'int example_interface_serial_read (int fd) {' имеет локальную переменную: 'int res = SUCCESS;' Однако эта переменная никогда не обновляется нигде в этой функции, поэтому блок кода начинается с: 'if (res <УСПЕХ) {'никогда не будет выполнен. Это, вероятно, не то, что вы хотите. Кроме того, функция должна проверить, что переданный параметр 'fd' содержит значение, которое представляет успешное открытие последовательного порта – user3629249

+1

этой строки:' if (res num_bytes_read) {' – user3629249

+1

, как правило, дескриптор файла, возвращенный из вызова' open() ', является индексом в таблицу дескриптора файла. Обычно это очень небольшое число, например 4. – user3629249

ответ

0

От разработчика устройства:

Возвращаемое значение из открытого() функции является знаковым int, и> = нуль для успеха и меньше нуля для отказа.

Причина в том, что возвращаемое значение настолько велико, потому что оно смещено на известную константу 0x0FFFFFFF. Это делается для того, чтобы различать устройства ручками из дескрипторов файловой системы (файловые системы всегда меньше , чем 0x0FFFFFFF), которые обрабатываются по-разному в коде aDSP.

Причудливый! : P