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

 
 
5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
> LPC11xx не стартует код из своего бутлоадера
Almaz1988
сообщение Oct 8 2012, 09:28
Сообщение #61


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

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



Цитата(Сергей Борщ @ Oct 8 2012, 09:34) *
Посчитать ее при помощи какой-либо внешней утилиты и добавить той же или другой утилитой в прошиваемый программатором файл.

Так и сделал, тем более и Keil рекомендует такое решение.

Цитата
Поэтому я делаю так: в первую же ячейку сразу за векторами линкер записывает размер приложения. CRC кладется сразу же следом за приложением.

Как вы это проделываете? Скаттер файл изменяете?

Получается у вас контрольная сумма записывается не в последнюю очередь? Для максимальной надежности механизма логично писать ее в последнюю очередь.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 8 2012, 11:02
Сообщение #62


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Almaz1988 @ Oct 8 2012, 12:28) *
Как вы это проделываете? Скаттер файл изменяете?
Я использую gcc и делаю это через его скрипт линкера. В Кейле, насколько мне известно, такую функцию выполняет скаттер-файл. Значит менять надо его, да.
QUOTE (Almaz1988 @ Oct 8 2012, 12:28) *
Получается у вас контрольная сумма записывается не в последнюю очередь?
Почему вы так решили? В скрипте линкера под контрольную сумму выделается место после кода и данных, после линковки контрольная сумма вписывается в это зарезервированное место сторонней утилитой.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Almaz1988
сообщение Oct 8 2012, 11:45
Сообщение #63


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

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



В общем осталась последняя проблема.
Есть функция Х( ). В МАР-файле она расположена по адресам 0х00000175 - 0х00000189.
Когда я прыгаю в ячейку 0х00000175, вызывается эта функция:
Код
    void (*fptr)(void);
    fptr = (void (*)(void))0x00000175;
    fptr();



Копирую эти адреса в оперативку по адресу начиная с 0х10000300. Эта область "откушена" в настройках проекта и она не затирается при работе. Дебагером смотрю - скопирована точь-в-точь и не затирается.
Но когда прыгаю по адресу 0х10000300. Эта функция не вызывается.
Что я не учел?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 8 2012, 11:57
Сообщение #64


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Almaz1988 @ Oct 8 2012, 14:45) *
Что я не учел?
Надо пошагать в отладчике. Версии есть, но излагать их довольно долго (предполагаю, дело в способах адресации внутри функции). Попробуйте поискать в документации ключевое слово ramfunc или похожее на него - оно как раз для этих целей.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
igor_mmm
сообщение Oct 9 2012, 03:21
Сообщение #65





Группа: Новичок
Сообщений: 7
Регистрация: 3-10-12
Пользователь №: 73 792



Цитата(Almaz1988 @ Oct 8 2012, 08:11) *
Вот как выглядит моя функция отправки 4-ехбайтового сообщения:

Код
void CANsend4byte(uint32_t ID, uint32_t DATA )                
{
    CAN_MSG_OBJ msg_obj_transmit;
    msg_obj_transmit.msgobj  = 0;        
    msg_obj_transmit.mode_id = ID;
    msg_obj_transmit.mask    = 0x0;
    msg_obj_transmit.dlc     = 4;                            
    msg_obj_transmit.data[0] = DATA;                        
    msg_obj_transmit.data[1] = DATA>>8;
    msg_obj_transmit.data[2] = DATA>>16;
    msg_obj_transmit.data[3] = DATA>>24;
    while (flagMessageTransmitted != 1);    
    (*rom)->pCAND->can_transmit(&msg_obj_transmit);
    flagMessageTransmitted = 0;
}

Она рабочая

Убираешь строчку
Код
while (flagMessageTransmitted != 1);

Если подтверждение не требуется


а где взять переменную "flagMessageTransmitte" и кто ее выставляет
я так понимаю кто то в прерывании эту переменную выставляет 1
покажите весь пример пожалуйста
Go to the top of the page
 
+Quote Post
Almaz1988
сообщение Oct 9 2012, 04:24
Сообщение #66


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

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



Цитата(igor_mmm @ Oct 9 2012, 06:21) *
а где взять переменную "flagMessageTransmitte" и кто ее выставляет
я так понимаю кто то в прерывании эту переменную выставляет 1
покажите весь пример пожалуйста


В прерывании CAN_TX, которое вызывается автоматически всякий раз при успешной отправке сообщения.
В примере устройство каждые 0.5 сек шлет хартбит.
Отправь SDO-запрос: 0х601 40 00 10 00 00 00 00 00, оно откликнется сообщением с ид-ром 0х581.
Отправь любое сообщение с ид-ром меньше - 0х600 загорится светодиод на выводе 2.1
Прикрепленные файлы
Прикрепленный файл  to_forum.rar ( 372.66 килобайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
igor_mmm
сообщение Oct 9 2012, 05:53
Сообщение #67





Группа: Новичок
Сообщений: 7
Регистрация: 3-10-12
Пользователь №: 73 792



Цитата(Almaz1988 @ Oct 9 2012, 08:24) *
В прерывании CAN_TX, которое вызывается автоматически всякий раз при успешной отправке сообщения.
В примере устройство каждые 0.5 сек шлет хартбит.
Отправь SDO-запрос: 0х601 40 00 10 00 00 00 00 00, оно откликнется сообщением с ид-ром 0х581.
Отправь любое сообщение с ид-ром меньше - 0х600 загорится светодиод на выводе 2.1

добрый день!
я смотрю пример и вижу , что вы отправляете сообщение через промежутки времени. при "удачной" передаче заходите в прерывание и выставляете флаг - понятно.
Но как быть если передача тыла так сказать неудачная (датчик отвалился) (ведущим так сказать в моем случае будет контроллер lpc ). Он (контроллер) будет пытаться отослать посылку повторно.
Я сделал так перед передачей выставил флаг "DAR" - отключение повторной передачи и выдаю раз в секунду. контроллер зараза первый 16 секунд не выдает (либо выдает но прерывается но пол посылки потому что не видит датчика ) а потом начинает успешно выдавать раз в секунду.
бит DAR - это как я понял отключение повторной передачи. а мне нужно что бы при отсутствии датчика посылка отправилась и только один раз.
== как это сделать я не знаю ===.
в принципе прерывание может возникнуть и при неправильной передаче это можно распознать но как потом отключить передачу (те есть очистить буфер)
Go to the top of the page
 
+Quote Post
Almaz1988
сообщение Oct 9 2012, 08:34
Сообщение #68


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

Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602



Цитата(Сергей Борщ @ Oct 8 2012, 14:57) *
Надо пошагать в отладчике. Версии есть, но излагать их довольно долго (предполагаю, дело в способах адресации внутри функции). Попробуйте поискать в документации ключевое слово ramfunc или похожее на него - оно как раз для этих целей.

Разобрался в чем дело: Если копирую функцию из флеша в ОЗУ, она не запускается. Если изначально "говорю" линкеру расположить функцию в ОЗУ она старутет нормально. Видимо дело в использовании абсолютной адресации в ассемблерном коде функций
Go to the top of the page
 
+Quote Post

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

 


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


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