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

 
 
> Нужен совет по 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
 
Start new topic
Ответов
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



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

 


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


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