Перейти к содержанию
    

KSN

Свой
  • Постов

    406
  • Зарегистрирован

  • Посещение

Весь контент KSN


  1. Bootloader&application

    Проблема решена. Глюк был в том, что общие функции вызывались как из прерывания приложения, так и из основного цикла приложения. В общих функция есть обращение по SPI к внешним контроллерам. В результате одновременного (прерывание + основной цикл) доступа вешался внешний девайс по SPI.
  2. Bootloader&application

    Загрузчик и приложение одновременно не работают, поэтому им не из-за чего драться. В загрузчике есть глобальные переменные, но они используются только в нем,а в общих функция не используются. Общие функции не используют глобальных переменных, только те, что им передали во время вызова (все функции с параматерами). При компиляции приложения глянул map файл, там оценака стека:CSTACK=0x5B RSTACK=0x1A. У меня в xcl файле CSTACK=0x120 RSTACK=0x60
  3. Bootloader&application

    Глюки: перестает работать основной цикл программы после вызова общей функции. Прерывания отрабатываются нормально. У меня есть несколько общих функции, которые вызывает приложение. Также есть еще несколько функции(назовем их дочерними функциями), которые расположены в том же сегменте, что и общие функции и которые вызываются общими функциями. Сейчас установил цепочку "ловушек"(дергание ножками) при вызове одной из общих функций. Результат: подвисание происходить внутри общей функции при вызове дочерних функций, причем, разных дочерних. Ну, мне все-таки надо попытаться сделать работоспособным приложением, т.к. при компиляции приложения и загрузчика с исходными текстами общих функций я не укладываюсь в размеры памяти кристалла.
  4. Bootloader&application

    В IAR есть два отдельных проекта: приложение и загрузчик. Оба этих проекта используют несколько одинаковых функций. Из экономии памяти решил, в проекте загрузчика создать сегмент, куда поместить общие функции. А в проекте приложения в xcl файле указал адреса этих функций, чтобы можно было вызывать эти функции. Скомпилировал два проекта по отдельности, объединил прошивки - все работает, но не стабильно. Глючить начинает, когда приложение вызывает общие функции. Проекты компилировались с разными уровнями оптимизации: загрузчик - максимум по размеру, а приложение - среднее по размеру. Есть подозрение, что в этом и дело, надо разбираться, чем и занимаюсь. Попутно хочу спросить, каким образом люди решают подобные задачи? Применять одинаковые уровни оптимизации обоих проектов; не оптимизировать общие функции; использовать общие функции на ассемблере и т.д.
  5. IAR AVR4.30

    Я правильно понял, это то что Вы просили? OPTIONS.bmpbootloader.7z
  6. IAR AVR4.30

    TX_SET8 это макрос, вот его код #define TX_SET8(a,b,c,d,e,f,g,h,i,j) Can_Tx.cmd = a; Can_Tx.id.ext = (Uint32)(B); Can_Tx.ctrl.ide = 1;\ Can_Tx.dlc = 8; Can_Tx.data[0] = c; Can_Tx.data[1] = d;\ Can_Tx.data[2] = e; Can_Tx.data[3] = f; Can_Tx.data[4] = g;\ Can_Tx.data[5] = h; Can_Tx.data[6] = i; Can_Tx.data[7] = j; Заодно привожу и описание Can_Tx: typedef enum { CMD_NONE, CMD_TX, CMD_TX_DATA, CMD_TX_REMOTE, CMD_TX_INT, CMD_TX_DATA_INT, CMD_TX_REMOTE_INT, CMD_RX, CMD_RX_DATA, CMD_RX_REMOTE, CMD_RX_MASKED, CMD_RX_DATA_MASKED, CMD_RX_REMOTE_MASKED, CMD_RX_INT, CMD_RX_DATA_INT, CMD_RX_REMOTE_INT, CMD_RX_MASKED_INT, CMD_RX_DATA_MASKED_INT, CMD_RX_REMOTE_MASKED_INT, CMD_REPLY, CMD_REPLY_MASKED, CMD_REPLY_INT, CMD_REPLY_MASKED_INT, CMD_ABORT } can_cmd_t; // ---------- typedef union{ Uint32 ext; Uint16 std; Uint8 tab[4]; } can_id_t; // ---------- typedef struct{ Bool rtr; Bool ide; } can_ctrl_t; typedef struct{ Uint8 handle; can_cmd_t cmd; can_id_t id; can_id_t mask; Uint8 dlc; // Uint8* pt_data; Uint8 status; can_ctrl_t ctrl; Uint8 data[8]; } st_cmd_t;
  7. IAR AVR4.30

    Прилагаю файлы iar430a.7z и iar520.7z В первом листинг, map, файл исходника с функцией main.c и *.xcl файл. Во втором только листинг и map.Iar430a.7zIar520.7z Iar430a.7z
  8. IAR AVR4.30

    1. Глюк в том, что получаю 0x78,0x12,0x12,0x00 ВМЕСТО 0x78,0x12,0x01,0x00. 2. А зачем sum.b присваивать? Я уже присвоил: sum.dw = (unsigned long)0x00011278;
  9. IAR AVR4.30

    Пишу загрузчик для AT90CAN128 и столкнулся с проблемой. Далее привожу часть кода, которая вызывает ошибку. __C_task main(void) { // обявил переменную sum union { unsigned char b[4]; unsigned int w[2]; unsigned long dw; }sum; unsigned long data32; sum.dw = (unsigned long)0x00011278; // далее посыдаю побайтно sum.b[0], sum.b[1],sum.b[2],sum.b[3] в CAN data32 = (unsigned long)0x00011278; // далее посыдаю побайтно (unsigned char)data32, (unsigned char)(data32>>8), // (unsigned char)(data32>>16),(unsigned char)(data32>>24) в CAN } В результате вижу по CAN: 1-ая посылка: 0x78, 0x12, 0x12, 0x00 2-ая: 0x78, 0x12, 0x01, 0x00 В чем глюк понять не могу. Это клюк компилятора или я что-то не так делаю? Уровень оптимизации стоит максимальный по объему кода. P.S. Скомпилировал проект под IAR AVR 5.20 все работает нормально. Подтвердите, это глюк компилятора?
  10. STM32F103

    подкиньте примерчик написания функции прерывания для STM32. Что-то я не нашел *.h файла в папке IAR, где-бы определялись адреса векторов прерываний.
  11. STM32F103

    Достаточно много проектов сделано на ATmele(AVR,ARM) и как-то привык к startup, low_level_init и стилю, как там все организовано и описывается. Решил попробовать STM32. Поглядел примерчики под IAR. Все как-то необычно. Хотел бы услышать мнения и отзывы людей. которые используют STM32+IAR: используете ли функции/макросы (настройка таблицы векторов, настройка переферии и т.п.), которые есть примерах для IAR? Адаптируете их под себя(как удобней, как привыкли)? Создаете свои функции/макросы или где-то есть альтернатива?
  12. STM32F103xB6

    В reference manual сходу не нашел: как посторен механизм защиты flash памяти? При программировании (JTAG) устанавливаются fuse или как?
  13. Поделитесь впечатлениями от работы с STM32, Renesans, NEC: 1. Надежность контроллеров, помехоустойчивость; 2. Количество глюков, возникавшие трудности при работе с контроллерами. 3. Качество технической документации. 4. Какие средства разработки используете? Компилятор, отладчик. 5. Есть схемы программаторов? Желательно с USB интерфейсом.
  14. скорость по CAN 500kbit. Задачи софтинки: 2 PID регулятора управления движками (+24VDC) через ШИМ, 7 каналов подергать ножками когда надо, 16 каналов данные с АЦП неспешно получать, ну и по CAN пообщаться с другими девайсами UPD78F1836GK, также был вариант из 78K0/FE2 (детально не изучал). Выбирал чтобы CAN был и не менее 12 каналов АЦП.
  15. Затвор транзистора через последовательный резистор подключается к выходу микроконтроллера. Как правильно рассчитать номинал резистора?
  16. что касается NEC: 1. бесплатный программатор у них UART(это то, что я нашел), а есть вероятность программирования контроллера в "полевых условиях" с ноутбука, значит надо usb. 2. запрос на efind не нашел поставщиков контроллеров, которые мне подошли.
  17. Подходит atmega32C1, но ее купить не так просто (снабженцы сказали). Можно AT91SAM7A3 взять, ну уж очень много ножек:) Поглядел на NEC, но это надо искать(покупать) софт, средства отладки и т.п. Есть сомнения, а стоит ли с ними заморачиваться? Посоветуйте, кто что может.
  18. Так Вы обратитесь на конкретный завод с запросом в каком формате им необходимо предоставлять файлы трассировки и сверловки, и выяснить возможность AD сгенерировать файлы в требуемом формате.
  19. Возможно, что я не ясно выразился: проблема не в выборе языка(переключения между ними), а в удобной и понятной форме записи вывода сообщения. Выбор языка: Language = &ptr_eng[0]; и все. Не требуется одновременно печатать сообщения на двух языках. Или на одном, или на другом. Вариант 1. Да, имеет право быть. Но придется бегать по табличке, что не очень хочется. Вариант 2 и 3. Как я уже написал, это больше относится к выбору языка. Можно таким способом: #define MESSAGE1 0 #define MESSAGE2 1 char *message_rus[] = {"сообщение 1", "сообщение 2"}; char *message_eng[] = {"message 1", "message 2"}; char **Language[] = &message_rus[0]; LCD_print(Language[MESSAGE2]); // печатаю "сообщение 2" если нада вывести на английском "message 1", то Language = &message_eng[0]; LCD_print(Language[MESSAGE1]);
  20. Вывожу текстовые сообщения на индикатор. Требуется выводить на русском, либо на английском языке. Первое что пришло в голову: char message1_rus[]="сообщение 1"; char message2_rus[]="сообщение 2"; char message1_eng[]="message 1"; char message2_eng[]="message 2"; char *ptr_rus[] = {message1_rus,message2_rus}; char *ptr_eng[] = {message1_eng,message2_eng}; char **Language= &ptr_rus[0]; далее, при выводе LCD_print(Language[1]);// Вывожу "сообщение 2". что очень не удобно,т.к. надо знать номер сообщения в Language. Удобнее было бы использовать имя message2_rus. Есть идеи?
  21. IARARM5.11

    Объясните связь настроек линковщика (распределение памяти, icf файл), фактическими адресами в процессоре(даташит) и по каким адресам записывается программа во внутреннею флэш JFlashом? Неясности возникли с необходимостью размещения параметров во flash и их перезаписью. Создал секцию в icf, определил переменную в файле, удостоверился что переменная находится по данному адресу (map файл), залил прошивку в проц с помощью J-Flash(в настройках проекта на вкладке FLASH BaseAddr = 0x00100000). Для перепрограммирования исползовал функцию, приведенную ранее кем-то из форумчан, __ramfunc int flash_write_page(Uint32 addr, Uint8 *data); В качестве адреса задавал (Uint32)&Peremen и значение переменной не изменялось. Если делал так: 0x00100000+(Uint32)&Peremen, то все работало. Как правильно делать: 1. Задавать в настройках J-FLASH BaseAddr = 0x00000000 2. изменить распределение памяти в icf?
  22. Объясните связь настроек линковщика (распределение памяти, icf файл), фактическими адресами в процессоре(даташит) и по каким адресам записывается программа во внутреннею флэш JFlashом? Неясности возникли с необходимостью размещения параметров во flash и их перезаписью. Создал секцию в icf, определил переменную в файле, удостоверился что переменная находится по данному адресу (map файл), залил прошивку в проц с помощью J-Flash(в настройках проекта на вкладке FLASH BaseAddr = 0x00100000). Для перепрограммирования исползовал функцию, приведенную ранее кем-то из форумчан, __ramfunc int flash_write_page(Uint32 addr, Uint8 *data); В качестве адреса задавал (Uint32)&Peremen и значение переменной не изменялось. Если делал так: 0x00100000+(Uint32)&Peremen, то все работало. Как правильно делать: 1. Задавать в настройках J-FLASH BaseAddr = 0x00000000 2. изменить распределение памяти в icf?
×
×
  • Создать...