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

 
 
13 страниц V  « < 10 11 12 13 >  
Reply to this topicStart new topic
> Как писать на С++ при создание приложений под ARM, Примеры
neiver
сообщение Jul 5 2012, 12:29
Сообщение #166


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



А может эти списки реализовать как массивы указателей, типа ArrayList? Расход памяти будет меньше. Поиск будет быстрее, удаление из середины можно сделать посредствам записи нуля в соответствующий указатель. Если нужно много добавлять-удалять в конец и начало - можно на кольцевом буфере сделать - тоже очень быстро. Вставка в середину будет медленнее.
Так для чего нужны эти списки? Может и не надо на двухсвязных узлах их делать?
Go to the top of the page
 
+Quote Post
brag
сообщение Jul 5 2012, 13:42
Сообщение #167


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Ну пока были задачи такого плана:
Добвалять нужно в конец списка. Удалять как с начала так и с середины.
Массивы не подходят, тк код обычно библиотечный(и зачастую прекомпиленный) - юзеру передоставлять библиотеке кучу хранилищ для этих массивов и везде уследить за размером будет гемор жуткий. В виде двусвязанных списков все становится самоорганизованно - в либе выделяется несколько голов списков(фиксировано) а юзер может создавать сколько угодно обьектов и передавать ссылки библиотеке.
Go to the top of the page
 
+Quote Post
neiver
сообщение Jul 5 2012, 14:43
Сообщение #168


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



В таком случае всё-таки лучше укзатель на объект в CdllNode положить. Реализация с offsetof() очень шатка. Добавится (или удалистя) в SomeClass еще одно поле и прекомпиленная библиотека сломается.
А хранилище под эти очереди можно и пользователя попросить выделить, где и сколько ему нужно.
Go to the top of the page
 
+Quote Post
brag
сообщение Jul 5 2012, 15:41
Сообщение #169


Профессионал
*****

Группа: Свой
Сообщений: 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

Избавится бы от некоторой кривоты и было бы то, что надо...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Jul 9 2012, 06:34
Сообщение #170


Знающий
****

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



у меня один вопрос небольшой.

предположим есть задача реализовать некую непростую систему управления, имеется stm32f405 с 1МБ Флэш памятью, АРМ с 168Мгц частотой, и блоком FPU.
Предположительно будут работать две группы:
группа 1 занимается разводкой платы с сенсорами, приводами и разъемами к рулям управления итд.,
группа 2 разрабатывает алгоритмы управления и планирует писать программу управления на С++.

Есть два варианта:

Вариант 1: Разработать плату, подключить все устройства. Написать функции доступа к различным блокам, рулям, сенсорам через периферию. А затем, достать второй дебаггер, дать его группе 2 и начать дальше вместе с этой группой разрабатывать систему управления и подключать ее к своим функциям доступа к периферии.


Вариант 2: Разработать плату, подключить все устройства к ней как в варианте 1, но потом, организовать скажем УАРТ соединение с компом т.е. написать программу на Визуал С++ для работы с УАРТ, ну а там группа 2 пристроит к ней программу управления на С++ и запускать ее будет на компе, т.е. программа управления на компе управляыет платой и устройствами подключенными к ней и читает ее сенсоры. Ну а после того как скажем все отлажено, совместно с группой 2 портировать всю их программу на stm32f405


Я просто думаю не возникнет ли каких граблей в случае с вариантом 2 при портировании написанного кода на С++ с компа на stm32f405Ну чтото вроде, их программа окажется слишком замороченной и выйдет проблем много если попытатся запустить ее как есть на stm32f405 ?

С одной стороны вроде С++ он портируемый, но с другой стороны, не возникнет ли проблем каких с памятью или еще чем?

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

Так как лучше поступить, какой вариант выбрать более правильней будет?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 9 2012, 07:00
Сообщение #171


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



купить evalboard на планируемый проц для группы 2.
Go to the top of the page
 
+Quote Post
neiver
сообщение Jul 9 2012, 08:15
Сообщение #172


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Правильный вариант - это тот который максимально экономит время и деньги заказчика. А значит обе группы должны работать максимально параллельно. Судя по объёму памяти, программа будет довольно сложная. ИМХО имеет смысл делать так: пока первая группа разводит плату и т.д., вторая группа на Визуал С++ пишет и отлаживает высокоуровневые алгоритмы системы, реализовав низкоуровневые функции управления железом ввиде заглушек. А когда плата готова действовать по варианту 2, только УАРТ соединение с компом по большей части использовать для тестов и отладки "железных " функций.
Go to the top of the page
 
+Quote Post
Almaz1988
сообщение Oct 17 2012, 05:20
Сообщение #173


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



Пишу в Keil. Микроконтроллер lpc11c24.
Есть рабочий проект, использующий CAN-прерывания.
В этом проекте меняю расширение файла main.c на main.cpp.
В настройках проекта указываю --cpp.
Запускаю, прошиваю - программа стартует и работает до первого прерывания - оно не срабатывает
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 17 2012, 05:50
Сообщение #174


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



к функциям-обработчикам прерываний нужно приписать
extern "C":
Код
extern "C" InterruptHandler()
{
...
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 17 2012, 05:54
Сообщение #175


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
SSerge
сообщение Oct 17 2012, 06:19
Сообщение #176


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Almaz1988 @ Oct 17 2012, 12:20) *
Запускаю, прошиваю - программа стартует и работает до первого прерывания - оно не срабатывает

Волшебное слово extern "C" перед обработчиком прерывания не забыли?

ЗЫ. Долго думал sm.gif , опередили.
Если предполагается компилировать и в С и в С++ режиме, то так:
Код
#ifdef __cplusplus
  extern "C"
#endif


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Almaz1988
сообщение Oct 18 2012, 04:28
Сообщение #177


Частый гость
**

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



Ага, запустилась прога, спасибо)
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Jun 9 2014, 00:27
Сообщение #178


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Насыщенная ветка получилась. Нашел ответы на многие свои вопросы тут. Может на базе этой темы запилим небольшой FAQ по C++ для эмбедед, а то на форуме уже все чаще и чаще вопросы на эту тему. Может кто подведет своеобразный итог? Предлагаю следующую структуру:
1) Настройка компиляторов для работы с C++
2) Как смешивать С и С++ в одном проекте
3) Что такое синглтон и почему он так актуален для эмбед
4) Как выделять память под объекты. Почему не стоит эти объекты просто объявлять как глобальные переменные
5) Применение STL - как и стоит ли?

ну что то типа того...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 9 2014, 02:25
Сообщение #179


Гуру
******

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



Цитата(yanvasiij @ Jun 9 2014, 07:37) *
Может кто подведет своеобразный итог?
Инициатива наказуема. Подводите.


--------------------
На любой вопрос даю любой ответ
"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
AniGoch
сообщение Jun 17 2014, 06:47
Сообщение #180





Группа: Новичок
Сообщений: 4
Регистрация: 17-06-14
Пользователь №: 81 966



Вот набрёл на библиотеку С++
http://xpcc.sourceforge.net/api/main.html

Есть кое-что и для ARMов
Go to the top of the page
 
+Quote Post

13 страниц V  « < 10 11 12 13 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:54
Рейтинг@Mail.ru


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