Pull to refresh

Comments 12

void cVariablesDetector::run(void)


Зачем второй void? В смысле, для чего он в Си — я знаю, но в C++ он для этого не нужен. Особенности IAR?
Да, вы правы, в С++ в нем смысла нет: (void) и () — это одно и то же. Но так написано в стандарте кодирования. А в стандарте написано, потому что видимо раньше писали на Си, и перетекло оттуда.
А еще lint ругается — но сам же пишет, что в С++ это означает тоже самое что с void, что без void. В общем, чтобы удовлетворить lint и пройти без замечаний.
1717 empty prototype for function declaration, assumed '(void)' — An empty prototype,
as in:
void f();
has a different meaning in C than in C++. In C it says nothing about the arguments of the function;
in C++, it says there are no arguments. This message is not given for member function
declarations or for function definitions. Rather, weaker Elective Notes (1917 and 1918) are
given. This is because the chance of ambiguity does not exist in these cases. [11 section 8.2.5]
Да точно, еще раз вглянул стандарт С++
The parameter-declaration-clause determines the arguments that can be specified, and their processing,
when the function is called. [Note: the parameter-declaration-clause is used to convert the arguments
specified on the function call; see 5.2.2. ] If the parameter-declaration-clause is empty, the function takes
no arguments. The parameter list (void) is equivalent to the empty parameter list.
Я не отрицал выделенного. Вопрос про избыточность был. Но вообще:
Но так написано в стандарте кодирования.

хватило бы: от них иногда плеваться хочется, но никуда не попрёшь. Я, правда, думал, что вы для себя пишите. А откуда взялись tU32, tF32, tBoolean?
Ну это для себя было, точнее в свободное время для курса в университете(на волонтерских началах пока что), но чисто дома. К стандарту привык, потому что когда ревью кода делаю(сам писал давно очень, а ревью делаю переодически), моя задача проверить код на стандарт первым делом. Типы тоже указаны в стандарте.Скорее всего я его отдельно очень упрощенный для университета сделаю.
Наследование от iFilter выглядит плохо. Да и не интерфейс это, раз вы по iFilter* ни к кому не обращаетесь. Лучше создайте фильтр отдельно и заагрегируйте как-нибудь.
Не понимаю, зачем вы выкидываете всю настройку железа в __low_level_init(). Получается недо ооп. Если поменять ацп с ADC1 на ADC2, нужно и менять и функцию инициализации и сам класс.
Логично инициализировать периферию в конструкторе класса ацп, ведь он и предназначался для связи логики с железом.

При этом отдельно хочется заметить, что динамическое выделение памяти под классы, относящиеся к железу, во всраиваемых системах это моветон. Мало где увидишь плату, где например припаян разъем usb, а через секунду эти же ножки заняты внешней припаянной flash памятью или lcd дисплеем.
Как уже где-то писалось, крайне не хочется во время нажатия на педаль тормоза в автомобиле получить exception о том, что недостаточно памяти для выделения памяти под класс cBrakePushHandler.
Да по поводу динамического выделения памяти — согласен, в 3 части как раз фильтр реализовал, без него.
По поводу создания объектов с main(), тут есть особенность freeRTOS, если объявлять в main() вот так:
Извиняюсь нажал на Enter случайно…
1. Да по поводу динамического выделения памяти — согласен, в 3 части как раз фильтр реализовал, без него.
По поводу создания объектов с main(), тут есть особенность freeRTOS, если объявлять в main() вот так:
void main (void)
{
  cLedsDirector oLedsDirector;
  ...
  oRTOS.creatTask(&oLedsDirector...) ;
  oRTOS.startScheduler();
 
}

То вообще из-за особенностей работы freeRTOS, ничего работать не будет, посколько oLedsDirector создан на стеке, а при запуске планировщика и первой задачи, весь стек идет к чертям собачим, так как freeRTOS указатель стека перезаписывает на начало.
Поэтому тут надо будет либо немного «патчить» операционку, либо создавать объект oLedsDirector глобально. А глобальные объекты, тоже как то не по понятиям.
Поэтому нью тут решение подходящее, можно его переопределить, если уж совсем надо.
Из-за этой особенности операционки, нельзя создавать локальные переменные в мейне, ну точнее можно, но надо знать, что их потом нельзя использовать.
Ну и в данном проекте, все объекты создаются один раз в одном месте. и живут пока ресет не нажмут. Поэтому тут ничего плохого в этом нет. Никакого переполнения памяти не будет.

2. В лоу левел инит, скинул, только, то что не надо для конкретного проекта перенастраивать никогда. Но конечно, же это просто так мне захотелось, можно сделать и настройку отдельно, но я не хотел вообще железо(которое не перенастраивается) нигде трогать — настроил и забыл, а в классы вынес только, то что по ходу меняется. Там в регистр записать что-то, проверить и так далее…
Про переопределение стека фриртосом спасибо, не знал.
По поводу C++ в embedded советую книгу Real time c++
Спасибо за книгу, обязательно почитаю.
Sign up to leave a comment.

Articles