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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Обработка "своих" команд
d7d1cd
сообщение Mar 11 2012, 17:25
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Привет всем. Решил свой вопрос изложить здесь, так как считаю сей форум самым продвинутым. Имеется устройство на микроконтроллере MSP430F149. Это устройство может принимать команды по инфракрасному порту и по нему же их отправлять. Так же имеется прошивка этого микроконтроллера. Как мне "дописать" в прошивку свою процедуру обработки "моих" команд с инфракрасного порта? С чего начать?
Go to the top of the page
 
+Quote Post
hash20
сообщение Mar 12 2012, 11:13
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 24-01-12
Пользователь №: 69 858



Если исходников нету, то придется всё с "0" делать.... ибо дизассемблирование - дело не благодарное и заморочливое....
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 12 2012, 14:43
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



C 0 делать никак. Надо заморачиваться как-то!
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 16 2012, 03:01
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Дали такой совет: в дизассемблерной прошивке в каком-то месте сделать jmp в место, куда заранее вписать свою процедуру. Потом прыгнуть обратно. Стоит ли думать об осуществлении этого метода?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 16 2012, 04:26
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(d7d1cd @ Mar 16 2012, 07:01) *
Стоит ли думать об осуществлении этого метода?

Для начала, надо иметь прошивку.
Далее, если коммуникация осуществляется через UART, взять адрес обработчика из вектора прерывания UART и уже дальше колупать его.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 16 2012, 14:18
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Прошивка есть. Пока больше ничего. Подскажите, с чего начать?
Go to the top of the page
 
+Quote Post
MaslovVG
сообщение Mar 16 2012, 15:04
Сообщение #7


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

Группа: Свой
Сообщений: 1 210
Регистрация: 24-01-05
Из: Россия Волгодонск
Пользователь №: 2 134



Цитата(d7d1cd @ Mar 16 2012, 18:18) *
Прошивка есть. Пока больше ничего. Подскажите, с чего начать?

"Прыгать надо" Дизасемблируйте. Смотря какой объём программы. Берите IDA и вперед. Заодно увидите как в машинных кодах реализуются алгоритмы. Если опыта ревесинжениринга нет то килобайт за неделю расковыряеете.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 17 2012, 13:24
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Так что делать? Поступило 2 совета:
1. Взять адрес обработчика из вектора прерывания UART и колупать его;
2. "Прыгнуть" в адрес начала своей процедуры, потом прыгнуть обратно.

Какому совету следовать?

Сообщение отредактировал d7d1cd - Mar 17 2012, 13:24
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 20 2012, 14:10
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Что-то у меня не получается загрузить свою прошивку в IDA. Прошивку я получил следующим способом: сохранил в файле по порядку значения всех байтов из микроконтроллера начиная с адреса 0х0000 до адреса 0xFFFF. Почему IDA все помечает как сегмент ROM?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 21 2012, 04:55
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(d7d1cd @ Mar 20 2012, 18:10) *
сохранил в файле по порядку значения всех байтов из микроконтроллера начиная с адреса 0х0000 до адреса 0xFFFF.

Программная флешь начинается с 0x1100.
Насчет того, откуда прыгать - решайте сами. Но в случае, если обмен идет через UART, логично было бы начать с него.
В случае, если обраьотка производится непосредственно в прерывании, вам останется только вставить свою затычку.
А если асинхронно поллингом в мэйне, то будете иметь адрес буфера обмена, и потом уже в основной программе надо искать обращение к этому буферу.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 21 2012, 15:03
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата
Программная флешь начинается с 0x1100.
Насчет того, откуда прыгать - решайте сами. Но в случае, если обмен идет через UART, логично было бы начать с него.
В случае, если обраьотка производится непосредственно в прерывании, вам останется только вставить свою затычку.
А если асинхронно поллингом в мэйне, то будете иметь адрес буфера обмена, и потом уже в основной программе надо искать обращение к этому буферу.


Дизассемблить прошивку получилось. Подскажите, как узнать адрес обработчика прерывания UART?
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 22 2012, 08:22
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Mar 21 2012, 20:03) *
Дизассемблить прошивку получилось. Подскажите, как узнать адрес обработчика прерывания UART?

Он имеется в таблице векторов прерываний, адреса которой есть в документации (см. datasheet).
Go to the top of the page
 
+Quote Post
hash20
сообщение Mar 22 2012, 08:30
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 24-01-12
Пользователь №: 69 858



Пользуюсь IARом ... Открываем файл "msp430x14x.h" и в самом конце видим :


Код
/************************************************************
* Interrupt Vectors (offset from 0xFFE0)
************************************************************/

#define PORT2_VECTOR        (1 * 2u)  /* 0xFFE2 Port 2 */
#define USART1TX_VECTOR     (2 * 2u)  /* 0xFFE4 USART 1 Transmit */
#define USART1RX_VECTOR     (3 * 2u)  /* 0xFFE6 USART 1 Receive */
#define PORT1_VECTOR        (4 * 2u)  /* 0xFFE8 Port 1 */
#define TIMERA1_VECTOR      (5 * 2u)  /* 0xFFEA Timer A CC1-2, TA */
#define TIMERA0_VECTOR      (6 * 2u)  /* 0xFFEC Timer A CC0 */
#define ADC12_VECTOR        (7 * 2u)  /* 0xFFEE ADC */
#define USART0TX_VECTOR     (8 * 2u)  /* 0xFFF0 USART 0 Transmit */
#define USART0RX_VECTOR     (9 * 2u)  /* 0xFFF2 USART 0 Receive */
#define WDT_VECTOR          (10 * 2u) /* 0xFFF4 Watchdog Timer */
#define COMPARATORA_VECTOR  (11 * 2u) /* 0xFFF6 Comparator A */
#define TIMERB1_VECTOR      (12 * 2u) /* 0xFFF8 Timer B CC1-6, TB */
#define TIMERB0_VECTOR      (13 * 2u) /* 0xFFFA Timer B CC0 */
#define NMI_VECTOR          (14 * 2u) /* 0xFFFC Non-maskable */
#define RESET_VECTOR        (15 * 2u) /* 0xFFFE Reset [Highest Priority] *//


Сообщение отредактировал hash20 - Mar 22 2012, 08:31
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 22 2012, 15:46
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Ну вот например, проверяю вектор сброса. Адрес его 0xFFFE. По этому адресу находится слово 0х0012. Смотрю этот адрес в дизассемблере, но кода там нет. Там просто данные. Я что-то не так делаю?
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 22 2012, 18:10
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Mar 22 2012, 20:46) *
По этому адресу находится слово 0х0012.

Скорее всего не 0x0012, а 0x1200 sm.gif У MSP430 порядок расположения байтов в памяти little-endian.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 23 2012, 02:57
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



rezident, спасибо большое за наставление на путь истинный! Теперь все правильно: по адресу 0x1200 начинаются инструкции процессора.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 24 2012, 06:13
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Просветите меня по вопросу прерываний. Возьмем, для примера, прерывания по USART. Тут существует 2 вида прерываний - прерывание на прием и прерывание на отправку. Прерывание на прием, как я понимаю, срабатывает при поступлении байтов по USART. Зачем нужно прерывание на отправку и когда оно срабатывает?
Go to the top of the page
 
+Quote Post
Ramil
сообщение Mar 25 2012, 08:15
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 5-08-04
Пользователь №: 452




Прерывание на отправку нужно для того чтобы дождаться окончания отправки предыдущего загруженного в TXBUF байта. После того как байт "ушёл" выставляется флаг UTXIFG. По которому и возникает прерывание, если общие прерывания разрешены.
Go to the top of the page
 
+Quote Post
hash20
сообщение Mar 26 2012, 14:59
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 24-01-12
Пользователь №: 69 858



А ещё например в режиме SPI: при системе контроллер(мастер) - устройство(слэйв) врят-ли вы когда нибудь дождетесь прерывания по приему sm.gif)) поэтому для того чо-бы считать байт даных со слейва мы опраляем на него 0xff или 0x00 (обычно в даташите на слэйв устройство этот момент описывают) и соответвственно при прерывнии по TX в RXBUF будем наблюдать считанный из слэйва байт.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 27 2012, 02:39
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(hash20 @ Mar 26 2012, 18:59) *
А ещё например в режиме SPI: при системе контроллер(мастер) - устройство(слэйв) врят-ли вы когда нибудь дождетесь прерывания по приему sm.gif)) поэтому для того чо-бы считать байт даных со слейва мы опраляем на него 0xff или 0x00 (обычно в даташите на слэйв устройство этот момент описывают) и соответвственно при прерывнии по TX в RXBUF будем наблюдать считанный из слэйва байт.


А что значит 0x00 или 0xff? Это адрес запрашиваемого в слейве байта?
Go to the top of the page
 
+Quote Post
hash20
сообщение Mar 28 2012, 10:27
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 24-01-12
Пользователь №: 69 858



Цитата(d7d1cd @ Mar 27 2012, 06:39) *
А что значит 0x00 или 0xff? Это адрес запрашиваемого в слейве байта?


Записью байта в TXBUF ты запускаеш сдвиговый регистр, и выдачу 8-ми синхроимпульсов так вот слэйву будет похер какие данные ему приходят (!есть правда и хитрожопые SPI девайсы!) если он хочет что-либо выдать, ему нужны эти эти самые 8 синхроимпульсов блягодаря которым он запихнет в твой RXBUF свой байт! А адрес слейву перед этим выдается...

Таким образом при работе с 2-мя слэйвами вполне реально организовать одновременно вычитку одного слейва и запись другого !!! Главное эхо в настройках SPI модуля не включать sm.gif)))
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 16:01
Рейтинг@Mail.ru


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