|
|
  |
Как писать на С++ при создание приложений под ARM, Примеры |
|
|
|
Jul 5 2012, 15:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Указатель - эт костыль по сути, тк он всегда будет равен адресу CdllNode-какое-то смещение, + 1 слово памяти + пару тактов на чтение. offsetof согласен, опасная штука. В случаи с предоставлением хранилищ - юзер может и не уследить за размером либо делать проверку на рантайме, что тож не хотелось бы. Пока наколбасил такое CODE template<class T> class Cdll : private NonCopyable{ public: explicit Cdll(const T*){ Reset(); } void Reset(){ next=prev=static_cast<T*>(this); } void Enqueue(T *node){ // Insert at the Tail node->next=static_cast<T*>(this); node->prev=prev; prev->next=node; prev=node; } T* Dequeue(){ // Remove at the Head T *head=next; next=head->next; next->prev=static_cast<T*>(this); return head; } void Remove(){ // remove node prev->next=next; next->prev=prev; } T* Next()const{ return next; } T* Prev()const{ return prev; } bool isEmpty()const{ return next==static_cast<T*>(this); } bool isBaseNode(const T *node)const{ return node==static_cast<T*>(this); } private: T *next; T *prev; };
// ------------------------------ Usage ---------------------------- class Q1 : public Cdll<Q1>{ public: Q1(): Cdll(this) {} };
class Q2 : public Cdll<Q2>{ public: Q2(): Cdll(this) {} };
class Tcb : public Q1,public Q2{ public: template<class T> static Tcb* getInst(T *node){ return static_cast<Tcb*>(node); } };
Q1 q1; Q2 q2; Tcb tcb1,tcb2;
int main(){ q1.Enqueue(&tcb1); q2.Enqueue(&tcb1); q1.Enqueue(&tcb2); q2.Enqueue(&tcb2); Q1 *n1=q1.Dequeue(); Q2 *n2=q2.Dequeue(); Tcb *t1=Tcb::getInst(n1); Tcb *t2=Tcb::getInst(n2); printf("%p %p\n%p %p\n%p %p\n", n1,n2,t1,t2, Tcb::getInst(q1.Dequeue()), Tcb::getInst(q2.Dequeue()) ); return 0; }
00405030 00405038 00405030 00405030 00405040 00405040
Избавится бы от некоторой кривоты и было бы то, что надо...
|
|
|
|
|
Jul 9 2012, 06:34
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
у меня один вопрос небольшой.
предположим есть задача реализовать некую непростую систему управления, имеется stm32f405 с 1МБ Флэш памятью, АРМ с 168Мгц частотой, и блоком FPU. Предположительно будут работать две группы: группа 1 занимается разводкой платы с сенсорами, приводами и разъемами к рулям управления итд., группа 2 разрабатывает алгоритмы управления и планирует писать программу управления на С++.
Есть два варианта:
Вариант 1: Разработать плату, подключить все устройства. Написать функции доступа к различным блокам, рулям, сенсорам через периферию. А затем, достать второй дебаггер, дать его группе 2 и начать дальше вместе с этой группой разрабатывать систему управления и подключать ее к своим функциям доступа к периферии.
Вариант 2: Разработать плату, подключить все устройства к ней как в варианте 1, но потом, организовать скажем УАРТ соединение с компом т.е. написать программу на Визуал С++ для работы с УАРТ, ну а там группа 2 пристроит к ней программу управления на С++ и запускать ее будет на компе, т.е. программа управления на компе управляыет платой и устройствами подключенными к ней и читает ее сенсоры. Ну а после того как скажем все отлажено, совместно с группой 2 портировать всю их программу на stm32f405
Я просто думаю не возникнет ли каких граблей в случае с вариантом 2 при портировании написанного кода на С++ с компа на stm32f405Ну чтото вроде, их программа окажется слишком замороченной и выйдет проблем много если попытатся запустить ее как есть на stm32f405 ?
С одной стороны вроде С++ он портируемый, но с другой стороны, не возникнет ли проблем каких с памятью или еще чем?
Программу или алгоритм управления можно написать например полностью независимым от низкого уровня функций которые с периферией на чипе общяются, сенсорами, рулями итд.
Так как лучше поступить, какой вариант выбрать более правильней будет?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Oct 17 2012, 05:54
|

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

|
QUOTE (Almaz1988 @ Oct 17 2012, 08:20)  работает до первого прерывания - оно не срабатывает Забыли добавить квалификатор extern "C" к обработчикам прерываний, находящимся в .cpp файлах.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 17 2012, 06:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Almaz1988 @ Oct 17 2012, 12:20)  Запускаю, прошиваю - программа стартует и работает до первого прерывания - оно не срабатывает Волшебное слово extern "C" перед обработчиком прерывания не забыли? ЗЫ. Долго думал  , опередили. Если предполагается компилировать и в С и в С++ режиме, то так: Код #ifdef __cplusplus extern "C" #endif
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|