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

 
 
 
Reply to this topicStart new topic
> Что это - глюк 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
defunct
сообщение May 6 2008, 03:36
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(IF_P @ May 5 2008, 22:05) *
Почему? Во Franklin'е такого замечено не было. Как избавиться от этого?

А почему нет?
Что запрещает разместить эти локальные переменные в регистрах?
И в чем глубокий смысл этого "=" :

return (vv_dat=atoi(IN_ASCII_BUFF_L));

Цитата
После выполнения ф-ции atoi() получаем ерунду. Видимо эти р-ры в ф-ции тоже используются.

нет причина в чем-то другом. Размещение этих переменных (old, vv_dat) никак не могут сказываться на результате atoi.
Go to the top of the page
 
+Quote Post
IF_P
сообщение May 6 2008, 06:28
Сообщение #3


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

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



[quote name='defunct' date='May 6 2008, 06:36' post='406878']
А почему нет?
Что запрещает разместить эти локальные переменные в регистрах?
И в чем глубокий смысл этого "=" :

return (vv_dat=atoi(IN_ASCII_BUFF_L));
[/quote]
"Тайного смысла" здесь нет. Раньше vv_dat вычислялось в теле п/п. Потом пошли изменения. при отладке поставил так, вот оно и осталось. Согласен, уберу "vv_dat=".

нет причина в чем-то другом. Размещение этих переменных (old, vv_dat) никак не могут сказываться на результате itoa.
[/quote]
Да, причина не в них. Я заменил локальную переменную глобальной и получил тоже самое:
Vent_revers=0xC355 после выполнения atoi().
А как в отладчике посмотреть память DATA, IDATA?
Прикрепленные файлы
Прикрепленный файл  prog3.rar ( 1.77 килобайт ) Кол-во скачиваний: 47
 
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 6 2008, 06:53
Сообщение #4


Гуру
******

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



Цитата(IF_P @ May 6 2008, 09:28) *
А как в отладчике посмотреть память DATA, IDATA?
View -> Memory window
В окне Memory указать адрес со спецификатором памяти
B Bit–addressable RAM memory (BIT)
C Code memory (CODE)
D Internal directly-addressable RAM memory of the 8051 (DATA)
I Internal indirectly-addressable RAM memory of the 8051 (IDATA)
X External RAM memory (XDATA)
Go to the top of the page
 
+Quote Post
редактор
сообщение May 6 2008, 10:43
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #6


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

Группа: Участник
Сообщений: 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
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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 Текстовая версия Сейчас: 29th June 2025 - 01:51
Рейтинг@Mail.ru


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