реклама на сайте
подробности

 
 
> Что это - глюк Keil или я чего-то не понял, Почему компилятор переменные заганяет в регистры?
IF_P
сообщение May 5 2008, 19:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Две переменные
D:0006H SYMBOL old
X:7800H SYMBOL n_char
D:0004H SYMBOL vv_dat

загнаны в регистры. Почему? Во Franklin'е такого замечено не было. Как избавиться от этого?

После выполнения ф-ции atoi() получаем ерунду. Видимо эти р-ры в ф-ции тоже используются.
Прикрепленные файлы
Прикрепленный файл  ttt.zip ( 7.37 килобайт ) Кол-во скачиваний: 44
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
редактор
сообщение May 6 2008, 10:43
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



1- Согласно дркументации Keil использует для передачи параметров и локальных переменных регистры текущего банка. Так что криминала нет.
2 - Проблема может быть в том что не закрыта строка (нет 0 в конце буфера IN_ASCII_BUFF_L).
3 - Keil иногда оптимизирует такие конструкции ( return (vv_dat=atoi(IN_ASCII_BUFF_L)); ), поэтому результат нужно смотреть не в переменной vv_dat а в регистре R7 (через него функция возвращает значение)


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
IF_P
сообщение May 12 2008, 17:02
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 136
Регистрация: 2-01-06
Пользователь №: 12 772



Цитата(редактор @ May 6 2008, 13:43) *
1- Согласно дркументации Keil использует для передачи параметров и локальных переменных регистры текущего банка. Так что криминала нет.
2 - Проблема может быть в том что не закрыта строка (нет 0 в конце буфера IN_ASCII_BUFF_L).
3 - Keil иногда оптимизирует такие конструкции ( return (vv_dat=atoi(IN_ASCII_BUFF_L)); ), поэтому результат нужно смотреть не в переменной vv_dat а в регистре R7 (через него функция возвращает значение)

После командировки снова возвратился к Keil.
Конструкцию return (vv_dat=...) заменил на return (atoi(IN_ASCII_L)). Но результата это не дало. А вот закрытие строки помогло. И сейчас ввод работает нормально. Буду проверять остальное.
Но вот что интересно.
Bin_To_ASCII(old);
IN_ASCII_BUFF[0]=Rab.symv5.old_value[0];
IN_ASCII_BUFF[1]=Rab.symv5.old_value[1];
...
return (atoi(IN_ASCII_BUFF));

Работает без закрытия строки. А вот такая конструкция:
Bin_To_ASCII(old);
IN_ASCII_BUFF_L[0]=Rab.symv4[0];
IN_ASCII_BUFF_L[1]=Rab.symv4[1];
IN_ASCII_BUFF_L[2]=Rab.symv4[2];
IN_ASCII_BUFF_L[3]=Rab.symv4[3];
IN_ASCII_BUFF_L[4]='\0';
...
return (atoi(IN_ASCII_BUFF_L));

работает только с завершающим нулем.
Хотелось бы докопаться до сути, что-бы не наступать на эти "грабли" в будущем.
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 13 2008, 05:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(IF_P @ May 12 2008, 20:02) *
...Работает без закрытия строки. А вот такая конструкция... работает только с завершающим нулем.
Вполне может быть, что в массиве IN_ASCII_BUFF нулевой байт случайно оказался на нужном месте (например, массив инициируется нулями при старте программы); а в массиве IN_ASCII_BUFF_L - на этом месте какая-то "бяка"... Посмотрите память перед выполнением atoi().
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2008, 08:18
Сообщение #5


Гуру
******

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



Цитата(Палыч @ May 13 2008, 08:16) *
Вполне может быть, что в массиве IN_ASCII_BUFF нулевой байт случайно оказался на нужном месте
Или переменная, расположенная в памяти следом за ним, в момент проверки содержала ноль.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016