Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нужен совет по Embedded programming для контроллера TI MSP430F149
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Steve2
Нужен совет по Embedded programming для контроллера TI MSP430F149

Есть ассемблерный проект. Необходимо потихоньку переписать его на С, сохраняя его функциональность во время этого процесса. Было принято решение использовать одновремено С и ассемблер в одном проекте. Мой вопрос об этом.

В проекте определен Interrupt vector в COMMON segment. Reset vector содержит адрес ISR Reset_Int которая находится в начале CODE segment. При включении контроллера происходит Reset Interrupt и исполнение программы начинаеться с
ISR Reset_Int.

Я добавляю С файл с функцией main() к ассемблерному проекту. Мне необходимо чтобы исполнение программы начиналось с этой самой main(). Я предполагаю, что сам линкер должен установить адрес main() в Reset vector. Так ли это? Или это должен как-то сделать я сам? Что происходит с существующим определением Interrupt vector? Нужно ли только зарезервировать место для Interrupt vector и линкер инициализирует его сам аддресом функции main()?

Очевидно что С инструкции будут транслированы в ассемблер и помещен в CODE segment. Меня интересует будет ли этот ассемблерный код ( из С) помещен в новый CODE segment или в существующий (где определен старый ассемблерный код)? Хотелось бы знать как происходит взаимотношение между двумя этими частями программы?

Посоветуйте хороший мануал или tutorial на эту тему?

Спасибо
rezident
Цитата(Steve2 @ May 5 2007, 02:35) *
В проекте определен Interrupt vector в COMMON segment. Reset vector содержит адрес ISR Reset_Int которая находится в начале CODE segment. При включении контроллера происходит Reset Interrupt и исполнение программы начинаеться с
ISR Reset_Int.

Я добавляю С файл с функцией main() к ассемблерному проекту. Мне необходимо чтобы исполнение программы начиналось с этой самой main(). Я предполагаю, что сам линкер должен установить адрес main() в Reset vector. Так ли это? Или это должен как-то сделать я сам? Что происходит с существующим определением Interrupt vector? Нужно ли только зарезервировать место для Interrupt vector и линкер инициализирует его сам аддресом функции main()?

Так, да не так. Между переходом по адресу, указанному вектором сброса и выполнением main есть еще промежуточный код "стартапа". В этом коде, в соответствии со стандартом Си, происходит инициализация и очистка глобальных и статических переменных. Плюс инициализируется указатель стека. Содержимое вектора Reset vector определяется самим компилятором, т.е. его отдельно инициализировать не нужно. Кроме того, например, в IAR EW430 в этой же секции, еще до инициализации переменных, можно вызвать функцию low_level_init в которой выполнить какие-то дополнительные команды. Например, выключить WatchDog Timer и проинициализировать систему тактирования. Выключение WDT до инициализации переменных может быть даже необходимым условием, т.к. после POR и PUC MSP430 тактируется от DCO, настроенного примерно на 900кГц (MCLK), а WDT настроен на тактирование от этой же MCLK с периодом около 32мс. При этом инициализация большого массива памяти может занять времени больше этих 32мс, что вызовет срабатывание WDT, снова на RESET и так по кругу.
Цитата(Steve2 @ May 5 2007, 02:35) *
Очевидно что С инструкции будут транслированы в ассемблер и помещен в CODE segment. Меня интересует будет ли этот ассемблерный код ( из С) помещен в новый CODE segment или в существующий (где определен старый ассемблерный код)? Хотелось бы знать как происходит взаимотношение между двумя этими частями программы?

Посоветуйте хороший мануал или tutorial на эту тему?

Если вы сами не определите отдельный сегмент для Си-ных функций и не укажите компилятору что функции нужно помещать именно в этот сегмент, то нет. И Ассемблерные функции и СИшные компилятор поместит в тот же самый сегмент CODE. Чтобы узнать о том, как корректно смешивать Си и Асм, нужно почитать документацию на ваш компилятор. Поскольку вы не указали его, то я не могу "ткнуть пальцем". В любом случае не помешает прошудировать стандарт ANSI C.
Steve2
Цитата(rezident @ May 5 2007, 01:45) *
Чтобы узнать о том, как корректно смешивать Си и Асм, нужно почитать документацию на ваш компилятор. Поскольку вы не указали его, то я не могу "ткнуть пальцем". В любом случае не помешает прошудировать стандарт ANSI C.


Спасибо за ответ. Мы используем IAR EW 430. Если у вас есть дополнительная инфа или документация по смешиванию С и ассемблера, пожалуйста порекомендуйте.
rezident
Цитата(Steve2 @ May 5 2007, 12:37) *
Спасибо за ответ. Мы используем IAR EW 430. Если у вас есть дополнительная инфа или документация по смешиванию С и ассемблера, пожалуйста порекомендуйте.

Все есть в комплекте. В IDE откройте Help->MSP430 C/C++ Compiler Reference Guide (файл EW430_CompilerReference.pdf в каталоге \430\doc). В нем раздел Assembler language interface->Mixing C and assembler.
Dog Pawlowa
Цитата(Steve2 @ May 4 2007, 23:35) *
Нужен совет по Embedded programming для контроллера TI MSP430F149
Есть ассемблерный проект. Необходимо потихоньку переписать его на С, сохраняя его функциональность во время этого процесса. Было принято решение использовать одновремено С и ассемблер в одном проекте. Мой вопрос об этом...

Вот только такое решение не всегда оправдано.
Во всяком случае я лично тоже принимал такое решение в свое время, но убедился, что это паранойя с ее главным признаком - раздвоением сознания. После нескольких недель такой эволюции я пришел к выводу ,что в революции тоже есть немало хорошего smile.gif и сделал проект на С, основываясь только на ТЗ и забыв про ассемблерный проект. Но у меня были дополнительные обстоятельства - опыт сложных проектов на ЯВУ со своими выработанными подходами, а проект на ассеблере был написан другим человеком.
Даже если Вы автор первого проекта, а сейчас беретесь постепенно изучать С, это не самый лучший путь.

Извините, немного не на вопрос, но по теме wink.gif
zltigo
Цитата(Dog Pawlowa @ May 5 2007, 14:01) *
Вот только такое решение не всегда оправдано.

Присоединяюсь. Ассемблерный подход будет довлеть над проектом sad.gif. Тем более, что желание переписать возникло не от хорошей жизни smile.gif
VAI
Полность поддерживаю 2-х последних авторов.
Steve2
Цитата(rezident @ May 5 2007, 01:45) *
Содержимое вектора Reset vector определяется самим компилятором, т.е. его отдельно инициализировать не нужно.

Я предполагал, что так и должно быть. Единственно что мне непонятно, в какой последовательности инициализируеться Reset vector ? Как я сказал в проекте уже определен Interrupt vector в COMMON segment.

Сначала С компилятор инициализирует Reset vector, а потом инициализируеться весь остальной Interrupt vector согласно определению в COMMON segment?

Должен ли я просто выделить место для Reset vector в Interrupt vector (в COMMON segment) и оставить его неинициализированным, так как его минициализирует компилятор С?

Спасибо за помощь.
rezident
Цитата(Steve2 @ May 5 2007, 19:29) *
Сначала С компилятор инициализирует Reset vector, а потом инициализируеться весь остальной Interrupt vector согласно определению в COMMON segment?

Процедура обработки прерывания на Си для IAR EW430 выглядит примерно так
Код
#pragma vector=TIMERA0_VECTOR
#pragma type_attribute=__interrupt
void TIMERA0_ISR(void)
{
/*здесь тело процедуры обработчика прерывания от TimerA/CCR0*/
}


Цитата(Steve2 @ May 5 2007, 19:29) *
Должен ли я просто выделить место для Reset vector в Interrupt vector (в COMMON segment) и оставить его неинициализированным, так как его минициализирует компилятор С?

Не нужно специально ни выделять место для Reset vector, ни нициализировать его. Я же уже объяснил вам, что компилятор Си сам сформирует и RESET_VECTOR и процедуру его обработки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.