SmileGobo 0 12 мая, 2011 Опубликовано 12 мая, 2011 · Жалоба Написал класс- абстракцию для 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 гонял на симуляторе Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 12 мая, 2011 Опубликовано 12 мая, 2011 · Жалоба Используйте, например, отложенную инициализацию, и инициализацию через списки. Эти и подобные решения хорошо описаны в хороших умных книжках и инете по плюсам. например здесь или здесь Я сам использую инициализацию до main. например, у меня подобных способом реализовано семейство классов-оберток вокруг обычных RTOS, коих много, а интерфейс остается один, независимо от выбранной RTOS. Тогда main остается вообще пустым, до него даже выполнение не доходит. А сами потоки можно объявлять где угодно, запуск вручную (можно сказать, что отложенный). Главное, объявить экзэмпляр хотя бы одного класса-потока (с приоритетом выше потока IDLE), где и создавать/запускать остальные потоки. Посмотрите еще плюсовое понятие singleton, в частности "синглтон Майерса" Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба И в этом случае программа валится в програмное прерываниев SWI? Краем уха слышал, что у кейла на нем висят какие-то системные вызовы. Вы подключили обработчик? я так понимаю до main() невозможно вызвать свой код? Или же можно как-то проинициализировать статический экземпляр класса??? Стандартные типы инициализируются на ура, а вот с объектами проблема. Можно вызывать свой код. Отличие от стандартных типов в том, что для классов вызывается конструктор. Возможно где-то на этом этапе кейл и использует SWI. А что говорит листинг? В симуляторе код пошагать вызов этих конструкторов пробовали? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 13 мая, 2011 Опубликовано 13 мая, 2011 (изменено) · Жалоба 2 Forger Чтобы использовать отложенную инициализацию мне нужна динамическая память, а ее я бы не хотел использовать, так как не знаю сколько мне ее потребуется. Если вы мне подскажите методику как можно расчитывать heap при использовании задданого колличества классов и объектов. Собственно про умные книжки по плюсам хотелось больше конкретики. кроме шаблона синглотон, я тут пытаюсь реализовать шаблон реестра. Но опять для реализации этих шаблонов нужна динамическая память. Поэтому пытаюсь все делать статически Так же я не использую ОС вообще... 2 Сергей Борщ А зачем не вобще нужен обработчик програмного прерывания? А за пошаговую отладку по конструктору что-то не догадался, пойду прогоню После перехода по адресу __main отладчик перестает выполнятся по шагам IMPORT __main LDR R0, =__main BX R0 а по принудительной остановке висит тут: SWI_Handler B SWI_Handler Что касается массива объектов, то он вполне себе проинициализирован, хотя до конструкторов дело не дошло. Я в недоумении. Изменено 13 мая, 2011 пользователем SmileGobo Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба А зачем мне вобще нужен обработчик програмного прерывания?Вам, возможно, и не нужен. А вот Кейл его может использовать для организации вызовов библиотечных функций. Повторяюсь: сам я Кейла не использую, это моя догадка, основанная на чтении краем глаза веток, посвященных кейлу. Этот вопрос должен быть освещен в документации. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба нету в кейле библиотек (( вот сам пишу Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба Чтобы использовать отложенную инициализацию мне нужна динамическая память, а ее я бы не хотел использовать, так как не знаю сколько мне ее потребуется. Если вы мне подскажите методику как можно расчитывать heap при использовании задданого колличества классов и объектов. А я вообще не использую динамическую память, и в настройках линкера указываю размер кучи ноль байт. Даже считаю ее злом в таких встраиваемых решениях с фиксированных набором задач. К тому же есть такое понятие в RTOS - pool, это что-то типа кучи блоков фиксированного размера. Посмотрите туда. Работает гораздо предсказуемее обычной кучи - в принципе нет фрагментации. Я по-началу делал с помощью односвязного списка запуск потоков, которые были объявлены статически до запуска RTOS (щас делаю чуть по-другому). Короче, почитайте под двух- и односвязные списки. p.s. Тут как-то недавно я писал про что-то подобное. Может, поможет. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akimych 0 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба А если глянуть call stack при попанаднии в SWI_Handler? Откуда вызов приходит. это не то? Хотя там вроде при использовании RTX kernel, но уж очень симптомы похожи. Вообще если кейл зачем-то вызывает это прерывание, то он должен вешать на него какой-то обработчик. Можно закоментировать SWI_Handler в стартапе, как предлагается по ссылке, и посмотреть, что туда закомпилируется. Я хотя не очень понял, как они предлагают просто закоментить строчку, при этом же вся таблица съедет. Странно вообще. Каком смысл кейлу использовать SWI и для чего, если не используется RTX. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yashok 0 14 мая, 2011 Опубликовано 14 мая, 2011 · Жалоба Я хотя не очень понял, как они предлагают просто закоментить строчку, при этом же вся таблица съедет. Коментируется обработчик, а не вектор в таблице. Попробуйте посмотреть в ассемблерном отладчике как происходит инициализация памяти при уходе на __main. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 15 мая, 2011 Опубликовано 15 мая, 2011 · Жалоба А у вас MIcriLib не используется? Если используется, то прочтите: MIcrolib + Keil Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 16 мая, 2011 Опубликовано 16 мая, 2011 (изменено) · Жалоба Короче, почитайте под двух- и односвязные списки. Да кой черт мне эти списки? =) Лучше поделитесь вашей библиотекой, если можно, я ваш код поизучаю))) Микролиб не юзаю - она плюсов не держит. Callstack погляжу в обед. Изменено 16 мая, 2011 пользователем SmileGobo Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 16 мая, 2011 Опубликовано 16 мая, 2011 · Жалоба Да кой черт мне эти списки? =) Лучше поделитесь вашей библиотекой, если можно, я ваш код поизучаю))) Нет, это не лучше: в сети полно готовых решений, а вы не хотите искать и читать! Я не хочу так помогать. Без обид :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 16 мая, 2011 Опубликовано 16 мая, 2011 (изменено) · Жалоба 2 Forger ну на нет и суда нет. И что я не хочу конкретно искать? Про реализацию паттернов или про реализацию списков? Я это и так прекрасно знаю, зачастую, эти реализации требуют динамическую память, ее мне использовать не хочется. В ссылках что вы преводили выше про отложенную инициализацию на плюсах примера вобще нет, а суть как и в паттерне синглтон, что опять требует памяти. Да и в целом все эти предложения не решают моей проблемы. Изменено 16 мая, 2011 пользователем SmileGobo Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться