|
Пару вопросов по Си для MCS51, от начинающего... |
|
|
|
 |
Ответов
|
Dec 12 2008, 10:38
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Добрый день. Написал для прерывания специальную функцию Spi_RD, но без передачи параметров. Все параметры передал через глобальную структуру. Пересекающихся адресов теперь нет. Все работает нормально. Печально это И печально именно то, что оказалось что Keil не сохраняет все локальные переменные при входе в процедуры. Сохраняет он только регистры. А еще более печально то, что прошло столько времени, а подобное в нем досих пор существует. Вердикт один. Если в прерывании используется процедура с количество передаваемых в нее параметров по размеру информации больше чем количество регистров, то такую процедуру в прерывании применять нельзя. Нужно или урезать передаваемые параметры или выводить их в глобальные. Мда. Что еще может подстерегать??? По сему заинтересовал вопрос перехода с Keil на другой компилятор и линковщик. Или просто другой линковщик (вроде как именно он раскидывает переменые по адресам???). Как себя ведут другие компиляторы касательно данной проблеммы??Не ну быть может это просто некрасиво конечно с точки зрения написания кода, передавать в функцию такое количество параметров как у меня. Но я надеялся, что компилятору это позубам. А иначе накой хрен переходить с Asm, когда мне и тут приходится заботиться о том чтобы небыло пересекающихся адресов?? На Си ведь переходят для удобства и быстроты написания программы (частный случай и лично мое мнение), быстрой модификации программы. В общем чтобы не иметь в частности такой головной боли как раскидывание по адресам локальных переменных.
--------------------
Удачи.
|
|
|
|
|
Dec 12 2008, 12:03
|

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

|
Цитата(AndreyS @ Dec 12 2008, 12:38)  И печально именно то, что оказалось что Keil не сохраняет все локальные переменные при входе в процедуры. Сохраняет он только регистры.  Смею предположить, что Кейл все делает правильно. Для цепочки вызовов он строит компилируемый стек и вы сами заметили, что локальные переменные разных функций в такой цепочке не пересекаются. Axel в сообщении №19 сказал вам, что ваш случай отличается от обычного, что вам надо найти способ указать компилятору, что функция является реентерабельной. Штудируйте документацию компилятора на предмет ключевого слова reentrant или подобного. Если бы компилятор каждую функцию делал реентерабельной - вы бы первый взвыли, что он сохраняет кучу лишнего и генерит неэффективный код. Кейлом и x51 уже очень давно не пользуюсь, поэтому не могу подсказать конкретнее, но на 99% уверен, что в нем предусмотрен какой-то атрибут вроде reentrant для функций.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 12 2008, 16:52
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 10-06-08
Из: Украина, Черкассы-Киев
Пользователь №: 38 188

|
Цитата(Сергей Борщ @ Dec 12 2008, 15:03)  Смею предположить, что Кейл все делает правильно. ...вам надо найти способ указать компилятору, что функция является реентерабельной. Штудируйте документацию компилятора на предмет ключевого слова reentrant или подобного. c51.pdf page 129Reentrant functions can be called recursively and can be called simultaneously by two or more processes. Reentrant functions are often required in real-time applications or in situations where interrupt code and non-interrupt code must share a function.или в ситуациях, когда код прерывания и код непрерывания должны совместно использовать функцию.
Сообщение отредактировал c8051 - Dec 12 2008, 16:53
|
|
|
|
|
Dec 13 2008, 20:34
|

Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276

|
Цитата(Сергей Борщ @ Dec 12 2008, 21:37)  Фух... Кейла оправдали. Очередной "глюк" оказался просто ленью прочитать документацию. Добрый день. Я и не называл это глюком. В самом первом своем сообщении я сразу просил подсказать что мне сделать. Позже, когда все свелось к изменению способа вызова процедуры, я просто сделал вывод, что Кейл просто не сохраняет в стек ту часть переменных, которая вылезла за регистры. Большое спасибо за наставление. Пойду читать документацию (просто читать ее всю подряд, от корки до корки, я не хотел. В этом я действительно поленился  . Спасибо. PS. Да а на сообщение Axel я не обратил внимания
Сообщение отредактировал AndreyS - Dec 13 2008, 20:44
--------------------
Удачи.
|
|
|
|
Сообщений в этой теме
Lotor Пару вопросов по Си для MCS51 Jul 8 2007, 15:32 alcosar Цитата(Lotor @ Jul 8 2007, 18:32) Доброе ... Jul 8 2007, 19:51 Lotor Цитата(alcosar @ Jul 8 2007, 23:51) const... Jul 9 2007, 16:18  msn Цитата(Lotor @ Jul 9 2007, 19:18) Это-то ... Jul 10 2007, 21:25   zltigo Цитата(msn @ Jul 11 2007, 00:25) пишем...... Jul 10 2007, 22:57  Sir Jon Цитата(Lotor @ Jul 9 2007, 19:18) Это-то ... Sep 7 2007, 10:51   kolobok0 Цитата(Sir Jon @ Sep 7 2007, 14:51) ..Хор... Sep 7 2007, 11:18 SALOME Цитата(Lotor @ Jul 8 2007, 22:32) Доброе ... Jul 9 2007, 03:46 oran-be ЦитатаЭто-то понятно, но есть вагон и маленькая те... Jul 9 2007, 18:17 Lotor Цитата(oran-be @ Jul 9 2007, 22:17) ... Jul 9 2007, 19:21  Sergu Цитата(Lotor @ Jul 9 2007, 22:21) Еще воз... Jul 10 2007, 03:51   Lotor Цитата(Sergu @ Jul 10 2007, 07:51) удобно... Jul 10 2007, 16:53 silc alcosar: const и не должен помещать в ОЗУ. Вам нуж... Aug 10 2007, 14:57 Василий_Безкатегорийный Насчет побитового обращения к портам. Я пытаюсь ра... Sep 25 2007, 08:45 AndreyS Добрый день.
Не стал создавать новую тему.
Вопро... Dec 10 2008, 08:56 barabek Цитата(AndreyS @ Dec 10 2008, 18:56) Суть... Dec 10 2008, 14:18  AndreyS Цитата(barabek @ Dec 10 2008, 17:18) Как ... Dec 10 2008, 16:08   barabek Цитата(AndreyS @ Dec 11 2008, 02:08) Прав... Dec 11 2008, 00:31    tag Цитата(barabek @ Dec 11 2008, 04:31) В эт... Dec 11 2008, 10:05     barabek Цитата(tag @ Dec 11 2008, 20:05) Уверяю в... Dec 11 2008, 10:53    AndreyS Цитата(barabek @ Dec 11 2008, 03:31) Если... Dec 11 2008, 12:00     barabek Цитата(AndreyS @ Dec 11 2008, 22:00) Комп... Dec 11 2008, 14:00      AndreyS Цитата(barabek @ Dec 11 2008, 17:00) Здес... Dec 11 2008, 14:37 AndreyS Люди!!! Помогите. Пока перебросил пере... Dec 10 2008, 10:57 Axel Если функция не написана, как реентерабельная (сло... Dec 10 2008, 17:37
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|