|
|
  |
Нужен совет по Embedded programming для контроллера TI MSP430F149, С и ассемблер в одном проекте |
|
|
|
May 4 2007, 20:35
|
Группа: Новичок
Сообщений: 4
Регистрация: 4-05-07
Пользователь №: 27 522

|
Нужен совет по 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 на эту тему?
Спасибо
|
|
|
|
|
May 4 2007, 21:45
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(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.
|
|
|
|
|
May 5 2007, 06:37
|
Группа: Новичок
Сообщений: 4
Регистрация: 4-05-07
Пользователь №: 27 522

|
Цитата(rezident @ May 5 2007, 01:45)  Чтобы узнать о том, как корректно смешивать Си и Асм, нужно почитать документацию на ваш компилятор. Поскольку вы не указали его, то я не могу "ткнуть пальцем". В любом случае не помешает прошудировать стандарт ANSI C. Спасибо за ответ. Мы используем IAR EW 430. Если у вас есть дополнительная инфа или документация по смешиванию С и ассемблера, пожалуйста порекомендуйте.
|
|
|
|
|
May 5 2007, 09:10
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(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.
|
|
|
|
|
May 5 2007, 11:01
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Steve2 @ May 4 2007, 23:35)  Нужен совет по Embedded programming для контроллера TI MSP430F149 Есть ассемблерный проект. Необходимо потихоньку переписать его на С, сохраняя его функциональность во время этого процесса. Было принято решение использовать одновремено С и ассемблер в одном проекте. Мой вопрос об этом... Вот только такое решение не всегда оправдано. Во всяком случае я лично тоже принимал такое решение в свое время, но убедился, что это паранойя с ее главным признаком - раздвоением сознания. После нескольких недель такой эволюции я пришел к выводу ,что в революции тоже есть немало хорошего  и сделал проект на С, основываясь только на ТЗ и забыв про ассемблерный проект. Но у меня были дополнительные обстоятельства - опыт сложных проектов на ЯВУ со своими выработанными подходами, а проект на ассеблере был написан другим человеком. Даже если Вы автор первого проекта, а сейчас беретесь постепенно изучать С, это не самый лучший путь. Извините, немного не на вопрос, но по теме
--------------------
Уходя, оставьте свет...
|
|
|
|
|
May 5 2007, 13:29
|
Группа: Новичок
Сообщений: 4
Регистрация: 4-05-07
Пользователь №: 27 522

|
Цитата(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) и оставить его неинициализированным, так как его минициализирует компилятор С? Спасибо за помощь.
|
|
|
|
|
May 5 2007, 17:29
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(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 и процедуру его обработки.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|