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

 
 
> Пару вопросов по Си для MCS51, от начинающего...
Lotor
сообщение Jul 8 2007, 15:32
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Доброе время суток. Начал тут изучать C для 51-х и возникли глупые вопросы:
1) Как Вы отсчитываете (формируете) боле-мене точные временные интервалы? Допустим надо сформировать задержку в 1 секунду, стандартной функции у Keil'a нет, надо писать самим. Есть ли стандартные приемы? Или надо написать какую-нить простенькую конструкцию аля for (i=40;i>0;i--), посмотреть какой ассемблеровский код ей соответствует после компиляции и затем прикинуть? Или в программном симуляторе засечь? Но это же так тоскливо... Можно ли решить задачу не методом такого подбора?
2) Как массив помещается в память програм? Keil пихает в драгоценное ОЗУ даже при объявлении со спецификатором const.
Буду благодарен за ответы)


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AndreyS
сообщение Dec 12 2008, 10:38
Сообщение #2


Местный
***

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



Добрый день.

Написал для прерывания специальную функцию Spi_RD, но без передачи параметров. Все параметры передал через глобальную структуру.

Пересекающихся адресов теперь нет. Все работает нормально.

Печально это sad.gif
И печально именно то, что оказалось что Keil не сохраняет все локальные переменные при входе в процедуры. Сохраняет он только регистры. sad.gif

А еще более печально то, что прошло столько времени, а подобное в нем досих пор существует.

Вердикт один. Если в прерывании используется процедура с количество передаваемых в нее параметров по размеру информации больше чем количество регистров, то такую процедуру в прерывании применять нельзя. Нужно или урезать передаваемые параметры или выводить их в глобальные.

Мда. Что еще может подстерегать???

По сему заинтересовал вопрос перехода с Keil на другой компилятор и линковщик. Или просто другой линковщик (вроде как именно он раскидывает переменые по адресам???).

Как себя ведут другие компиляторы касательно данной проблеммы??

Не ну быть может это просто некрасиво конечно с точки зрения написания кода, передавать в функцию такое количество параметров как у меня. Но я надеялся, что компилятору это позубам. А иначе накой хрен переходить с Asm, когда мне и тут приходится заботиться о том чтобы небыло пересекающихся адресов?? На Си ведь переходят для удобства и быстроты написания программы (частный случай и лично мое мнение), быстрой модификации программы. В общем чтобы не иметь в частности такой головной боли как раскидывание по адресам локальных переменных.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 12 2008, 12:03
Сообщение #3


Гуру
******

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



Цитата(AndreyS @ Dec 12 2008, 12:38) *
И печально именно то, что оказалось что Keil не сохраняет все локальные переменные при входе в процедуры. Сохраняет он только регистры. sad.gif
Смею предположить, что Кейл все делает правильно. Для цепочки вызовов он строит компилируемый стек и вы сами заметили, что локальные переменные разных функций в такой цепочке не пересекаются. Axel в сообщении №19 сказал вам, что ваш случай отличается от обычного, что вам надо найти способ указать компилятору, что функция является реентерабельной. Штудируйте документацию компилятора на предмет ключевого слова reentrant или подобного. Если бы компилятор каждую функцию делал реентерабельной - вы бы первый взвыли, что он сохраняет кучу лишнего и генерит неэффективный код. Кейлом и x51 уже очень давно не пользуюсь, поэтому не могу подсказать конкретнее, но на 99% уверен, что в нем предусмотрен какой-то атрибут вроде reentrant для функций.


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- 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
- - c8051   Цитата(Сергей Борщ @ Dec 12 2008, 15:03) ...   Dec 12 2008, 16:52
- - Сергей Борщ   Цитата(c8051 @ Dec 12 2008, 18:52) c51.pd...   Dec 12 2008, 18:37
- - AndreyS   Цитата(Сергей Борщ @ Dec 12 2008, 21:37) ...   Dec 13 2008, 20:34


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 20:14
Рейтинг@Mail.ru


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