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

Инициализация статического экземпляра класса ARM7 lpc23xx

Написал класс- абстракцию для UART

class UART:public Peripheral{
    //byte buf[8];
    protected:
    enum {
        RBR=0,THR=0,DLL=0,DLM=1,IER=1,IIR=2,FCR=2,LCR=3,
        LSR=5,SCR=7,ACR=8,ICR=9,FDR=10,TER=12        
    };
    static UART DEV[UART_SIZE];

    public:
        //UART(UARTName name,UARTOption *Option = (UARTOption *)NULL);
        UART(UARTName name);
        ~UART();
        void Init(UARTOption* Option);
        uint GetState() const;
        uint GetIntStatus() const;
        void ClearInt();
        bool Read(byte* buf,const uint& size);
        bool Send(byte* buf,const uint& size);
        void ClearRxFIFO();
        void ClearTxFIFO();
        static UART* GetUART(uint num);
};

 

Инициализирую статическую переменную:

 

UART UART::DEV[]={UART(UART_0),UART(UART_1),UART(UART_2),UART(UART_3)};

 

И в этом случае программа валится в програмное прерывание, я так понимаю до main() невозможно вызвать свой код? Или же можно как-то проинициализировать статический экземпляр класса???

Стандартные типы инициализируются на ура, а вот с объектами проблема.

 

среда KEIL uVision 4.10 гонял на симуляторе

 

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


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

Используйте, например, отложенную инициализацию, и инициализацию через списки.

Эти и подобные решения хорошо описаны в хороших умных книжках и инете по плюсам.

например здесь

или здесь

Я сам использую инициализацию до main.

например, у меня подобных способом реализовано семейство классов-оберток вокруг обычных RTOS, коих много, а интерфейс остается один, независимо от выбранной RTOS.

Тогда main остается вообще пустым, до него даже выполнение не доходит.

А сами потоки можно объявлять где угодно, запуск вручную (можно сказать, что отложенный).

Главное, объявить экзэмпляр хотя бы одного класса-потока (с приоритетом выше потока IDLE), где и создавать/запускать остальные потоки.

Посмотрите еще плюсовое понятие singleton, в частности "синглтон Майерса"

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


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

И в этом случае программа валится в програмное прерывание
в SWI? Краем уха слышал, что у кейла на нем висят какие-то системные вызовы. Вы подключили обработчик?

я так понимаю до main() невозможно вызвать свой код? Или же можно как-то проинициализировать статический экземпляр класса???

Стандартные типы инициализируются на ура, а вот с объектами проблема.

Можно вызывать свой код. Отличие от стандартных типов в том, что для классов вызывается конструктор. Возможно где-то на этом этапе кейл и использует SWI. А что говорит листинг? В симуляторе код пошагать вызов этих конструкторов пробовали?

 

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


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

2 Forger

 

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

 

Собственно про умные книжки по плюсам хотелось больше конкретики.

 

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

Поэтому пытаюсь все делать статически

 

Так же я не использую ОС вообще...

 

 

2 Сергей Борщ

 

А зачем не вобще нужен обработчик програмного прерывания?

 

А за пошаговую отладку по конструктору что-то не догадался, пойду прогоню

 

После перехода по адресу __main отладчик перестает выполнятся по шагам

IMPORT  __main
LDR     R0, =__main
BX      R0

 

а по принудительной остановке висит тут:

SWI_Handler     B       SWI_Handler

Что касается массива объектов, то он вполне себе проинициализирован, хотя до конструкторов дело не дошло.

Я в недоумении.

Изменено пользователем SmileGobo

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


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

А зачем мне вобще нужен обработчик програмного прерывания?
Вам, возможно, и не нужен. А вот Кейл его может использовать для организации вызовов библиотечных функций. Повторяюсь: сам я Кейла не использую, это моя догадка, основанная на чтении краем глаза веток, посвященных кейлу. Этот вопрос должен быть освещен в документации.

 

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


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

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

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

Даже считаю ее злом в таких встраиваемых решениях с фиксированных набором задач.

К тому же есть такое понятие в RTOS - pool, это что-то типа кучи блоков фиксированного размера. Посмотрите туда. Работает гораздо предсказуемее обычной кучи - в принципе нет фрагментации.

 

Я по-началу делал с помощью односвязного списка запуск потоков, которые были объявлены статически до запуска RTOS (щас делаю чуть по-другому). Короче, почитайте под двух- и односвязные списки.

 

p.s.

Тут как-то недавно я писал про что-то подобное. Может, поможет.

 

 

 

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


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

А если глянуть call stack при попанаднии в SWI_Handler? Откуда вызов приходит.

это не то? Хотя там вроде при использовании RTX kernel, но уж очень симптомы похожи.

Вообще если кейл зачем-то вызывает это прерывание, то он должен вешать на него какой-то обработчик. Можно закоментировать SWI_Handler в стартапе, как предлагается по ссылке, и посмотреть, что туда закомпилируется. Я хотя не очень понял, как они предлагают просто закоментить строчку, при этом же вся таблица съедет.

 

Странно вообще. Каком смысл кейлу использовать SWI и для чего, если не используется RTX.

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


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

Я хотя не очень понял, как они предлагают просто закоментить строчку, при этом же вся таблица съедет.

 

Коментируется обработчик, а не вектор в таблице.

 

Попробуйте посмотреть в ассемблерном отладчике как происходит инициализация памяти при уходе на __main.

 

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


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

Короче, почитайте под двух- и односвязные списки.

 

Да кой черт мне эти списки? =)

Лучше поделитесь вашей библиотекой, если можно, я ваш код поизучаю)))

 

Микролиб не юзаю - она плюсов не держит.

 

Callstack погляжу в обед.

Изменено пользователем SmileGobo

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


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

Да кой черт мне эти списки? =)

Лучше поделитесь вашей библиотекой, если можно, я ваш код поизучаю)))

 

Нет, это не лучше: в сети полно готовых решений, а вы не хотите искать и читать!

Я не хочу так помогать. Без обид :)

 

 

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


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

2 Forger

ну на нет и суда нет.

 

И что я не хочу конкретно искать? Про реализацию паттернов или про реализацию списков? Я это и так прекрасно знаю, зачастую, эти реализации требуют динамическую память, ее мне использовать не хочется.

 

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

Изменено пользователем SmileGobo

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


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

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