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

 
 
 
Reply to this topicStart new topic
> Нужен совет по Embedded programming для контроллера TI MSP430F149, С и ассемблер в одном проекте
Steve2
сообщение May 4 2007, 20:35
Сообщение #1





Группа: Новичок
Сообщений: 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 на эту тему?

Спасибо
Go to the top of the page
 
+Quote Post
rezident
сообщение May 4 2007, 21:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Steve2
сообщение May 5 2007, 06:37
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 4-05-07
Пользователь №: 27 522



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


Спасибо за ответ. Мы используем IAR EW 430. Если у вас есть дополнительная инфа или документация по смешиванию С и ассемблера, пожалуйста порекомендуйте.
Go to the top of the page
 
+Quote Post
rezident
сообщение May 5 2007, 09:10
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 5 2007, 11:01
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Steve2 @ May 4 2007, 23:35) *
Нужен совет по Embedded programming для контроллера TI MSP430F149
Есть ассемблерный проект. Необходимо потихоньку переписать его на С, сохраняя его функциональность во время этого процесса. Было принято решение использовать одновремено С и ассемблер в одном проекте. Мой вопрос об этом...

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

Извините, немного не на вопрос, но по теме wink.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 5 2007, 12:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

Присоединяюсь. Ассемблерный подход будет довлеть над проектом sad.gif. Тем более, что желание переписать возникло не от хорошей жизни smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
VAI
сообщение May 5 2007, 13:16
Сообщение #7


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

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Полность поддерживаю 2-х последних авторов.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Steve2
сообщение May 5 2007, 13:29
Сообщение #8





Группа: Новичок
Сообщений: 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) и оставить его неинициализированным, так как его минициализирует компилятор С?

Спасибо за помощь.
Go to the top of the page
 
+Quote Post
rezident
сообщение May 5 2007, 17:29
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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 и процедуру его обработки.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 07:06
Рейтинг@Mail.ru


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