|
Чтение и запись во внешнюю память. |
|
|
|
Jun 25 2015, 11:13
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(Jenya7 @ Jun 25 2015, 13:58)  пока проблему решил так - просто делаю кастинг с float на uint32_t но это конечно ужасно. Может быть проблемы с atoi(argument1/2); ? Вы не пробовали отправлять в эхо команд и результаты работы функций atoi/atof? Что если не использовать аргументы а просто записывать по фиксированным адресам фиксированные данные. Или завести static int adr, value и инкрементиоровать их с каждой командой на запись. Мне приходилось работать как минимум с 2мя производителями памяти на 3х разных архитектурах процессоров. Были программные проблемы, но проблем с памятью никогда не было при выдерживании корректной процедуры записи.
|
|
|
|
|
Jun 25 2015, 11:25
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
В функциях из первого сообщения ошибок нет. Как вы понимаете, число с плавающей точкой занимает те же 4 байта, что и 32-битное целое. Поэтому компилятор должен был сгенерить идентичный код для SPIEEPROM_WriteInt() и SPIEEPROM_WriteFloat(), а также для пары функций чтения. Я бы на вашем месте для начала проверил корректность работы функции UART_SendInt() примерно так: Код else //write operation { #ifdef SPI_INT uint32_t ival = atoi(argument2); UART_SendInt(UART0,ival); // <------------------ SPIEEPROM_WriteInt(adr, &ival); Отладчик в точке останова может и не показать правильное значение переменной (если эта переменная на момент останова еще находится в регистре, например). Тут надо очень внимательно смотреть дизассемблированный код, чтобы понять - где именно на данной команде находится значение переменной.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 25 2015, 11:40
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Сергей Борщ @ Jun 25 2015, 17:25)  В функциях из первого сообщения ошибок нет. Как вы понимаете, число с плавающей точкой занимает те же 4 байта, что и 32-битное целое. Поэтому компилятор должен был сгенерить идентичный код для SPIEEPROM_WriteInt() и SPIEEPROM_WriteFloat(), а также для пары функций чтения. Я бы на вашем месте для начала проверил корректность работы функции UART_SendInt() примерно так: Код else //write operation { #ifdef SPI_INT uint32_t ival = atoi(argument2); UART_SendInt(UART0,ival); // <------------------ SPIEEPROM_WriteInt(adr, &ival); Отладчик в точке останова может и не показать правильное значение переменной (если эта переменная на момент останова еще находится в регистре, например). Тут надо очень внимательно смотреть дизассемблированный код, чтобы понять - где именно на данной команде находится значение переменной. Сергей сделал как вы советовали. Вижу в терминале правильное значение. В том то и весь маразм - функции для float и uint32_t абсолютно одинаковы за исключением самой переменной.
|
|
|
|
|
Jun 26 2015, 05:03
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Jenya7 @ Jun 25 2015, 16:37)  нашел проблему. в SPIEEPROM_Read() заменил все SPI_SendByte на SPI_TransferByte(). Есть некоторые сомнения. Либо у вас там теперь четное количество ошибок. Мы же согласились, что и для целого, и для числа с плавающей точкой SPIEEPROM_Read() и SPIEEPROM_Write() вызываются с идентичными параметрами. Если бы проблема была (только) внутри функции чтения, то она проявлялась бы и для целого, и для числа с плавающей точкой. Я еще в предыдущем сообщении хотел предложить вам попробовать записать/прочитать с помощью SPIEEPROM_Write()/SPIEEPROM_Read() массив из 10-20 байтов - на нем ошибка была бы виднее. Кстати, а что делает последний параметр в функции UART_SendFloat(UART0,fval,2)? Уж не количество ли знаков после запятой он указывает? Тогда вполне вероятно, что ошибку чтения в самом младшем байте вы могли просто не увидеть, потому что эти биты просто не попадают на экран.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 28 2015, 05:26
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Сергей Борщ @ Jun 26 2015, 11:03)  Есть некоторые сомнения. Либо у вас там теперь четное количество ошибок. Мы же согласились, что и для целого, и для числа с плавающей точкой SPIEEPROM_Read() и SPIEEPROM_Write() вызываются с идентичными параметрами. Если бы проблема была (только) внутри функции чтения, то она проявлялась бы и для целого, и для числа с плавающей точкой. Я еще в предыдущем сообщении хотел предложить вам попробовать записать/прочитать с помощью SPIEEPROM_Write()/SPIEEPROM_Read() массив из 10-20 байтов - на нем ошибка была бы виднее.
Кстати, а что делает последний параметр в функции UART_SendFloat(UART0,fval,2)? Уж не количество ли знаков после запятой он указывает? Тогда вполне вероятно, что ошибку чтения в самом младшем байте вы могли просто не увидеть, потому что эти биты просто не попадают на экран. Сергей вы как всегда правы. Третий параметр это количество знаков после запятой. Поэтому мы не видели ошибку.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|