Перейти к содержанию
    

Язык С, ARM - простые вопросы

Попробую ещё раз пояснить ...

Этап системного проектирования, постановки задачи и разбиения задачи на подзадачи вообще-то присутствует?

Вот и выбирается на этом этапе все, включая способы взаимодействия, ресурсы, особенности.

В общем случае "глобальность против локальности" не имеет решения. Та же "реентерабельность". Почему printf не реентерабельный, не задумывались? Почему разработчики компиляторов не хотят осчастливить страждущих?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем случае "глобальность против локальности" не имеет решения. Та же "реентерабельность".

Есть костыли - работать с указателем на структуру, содержащую "локальные" параметры функции, являющейся де-юре нереентерабельной. Если шаловливые ручки добираются до таких решений, то что это? (Что такое хорошо и что такое плохо?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Статически-то зачем? Спросили сколько надо у менеджера памяти. А вот стек, который потребуется Вам для Вашего непрогнозируемого количества "UART-ов" Вы как раз скорее всего статически-то и выделите. 

 

 

 

Товарищи капиталисты, по-моему вы путаете теплое с мягким.

 

Глобальное - то, что видно отовсюду и всегда живет (возможно спорно),

Локальное - определено и живет в пределах обьекта к которому принадлежит.

Пример - переменные обьявленные внутри функции - локальные для етой функции (

совсем не обязательно они должны быть на стеке),

переменные обьявленные внутри класс/структуры - локальны для етих

классов/структур и глобально (без структуры/класса) - невидимы.

Могут размещатся в хипе, от етого глобальными не становятся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Товарищи капиталисты, по-моему вы путаете теплое с мягким.

Глобальное - то, что видно отовсюду и всегда живет (возможно спорно),

Статическое - это то, что видно только там, где надо, и всегда живет. Не путайте мертвое  с пьяным :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть костыли - работать с указателем на структуру, содержащую "локальные" параметры функции, являющейся де-юре нереентерабельной.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Товарищи капиталисты, по-моему вы путаете теплое с мягким.

 

 

Это у Вас каша :( из глобальности и области видимости, на что я уже сразу указывал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 адреса параметров нужно вычислять по указателю на структуру.

Вообще-то нет, если используется доступ к локальным переменным через [регистр базы + смещение]. Один раз добрались до адреса- и все.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Один раз добрались до адреса- и все.

 

Угу! Удобно. Экономия при наличии у контроллера нужных режимов адресации в чистом виде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Статическое - это то, что видно только там, где надо, и всегда живет. Не путайте мертвое  с пьяным :)

 

 

смотря о каких языках говорил - C или C++?

 

2. живет не всегда. например, обьявленная внутри функции - с момента обращения к функции.

 

 

Это у Вас каша :( из глобальности и области видимости, на что я уже сразу указывал.

 

видимость переменной может быть и глобальной, но она являтся локальной -

обьявить паблик мембер - член класса

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. живет не всегда. например, обьявленная внутри функции - с момента обращения к функции.

Присмотритесь повнимательнее:  статические переменные живут изначально благодаря статической компиляции. И инициализация их (значением) производится в теле стартапа Поскольку это самое недорогое и здравое решение проблемы - позволить компилятору решить, где расположить переменную, оно применяется чаще всего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. живет не всегда. например, обьявленная внутри функции - с момента обращения к функции.
Живет она как раз всегда, а вот увидеть ее мы можем другой функцией

только после обращения к фунцкии в которой она определена(а можем и не увидеть если не захотим...).

 

Вот с вашей точки зрения в таком коде:

void someFunc()
{
  static unsigned char ch;
  ................
}

переменная ch глобальная или локальная ?

 

 

Разница между глобальными и локальными ИМХО, заключается в том что к глобальной(если захочу), могу обратиться

из любой другой функции, а вот к локальной только из функции в которой она создана.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

статические переменные живут изначально благодаря статической компиляции. И инициализация их (значением) производится в теле стартапа

А если статическая переменная локальная? Разве её инициализация будет производиться в стартапе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если статическая переменная локальная? Разве её инициализация будет производиться в стартапе?
Переменная из моего предыдущего поста статическая и объявлена в теле функции,

ее инициализация будет проведена в стартапе.

 

 

 

Более того(если захотеть), менять ее можно будет и из другой функции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Более того(если захотеть), менять ее можно будет и из другой функции.
Я извиняюсь, что вмешиваюсь. Работать с этой переменной в другой функции можно будет только по указателю, который данная функция должна сообщить другой, но не по символическому имени переменной.

Я тут некоторое время назад пояснял одному (точнее одной :) ) пользователю о типах переменных. Может интересно будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переменная из моего предыдущего поста статическая и объявлена в теле функции,

ее инициализация будет проведена в стартапе.

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

И совершенно не в стартапе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...