KSN
Свой-
Постов
406 -
Зарегистрирован
-
Посещение
Весь контент KSN
-
Проблема решена. Глюк был в том, что общие функции вызывались как из прерывания приложения, так и из основного цикла приложения. В общих функция есть обращение по SPI к внешним контроллерам. В результате одновременного (прерывание + основной цикл) доступа вешался внешний девайс по SPI.
-
Загрузчик и приложение одновременно не работают, поэтому им не из-за чего драться. В загрузчике есть глобальные переменные, но они используются только в нем,а в общих функция не используются. Общие функции не используют глобальных переменных, только те, что им передали во время вызова (все функции с параматерами). При компиляции приложения глянул map файл, там оценака стека:CSTACK=0x5B RSTACK=0x1A. У меня в xcl файле CSTACK=0x120 RSTACK=0x60
-
Глюки: перестает работать основной цикл программы после вызова общей функции. Прерывания отрабатываются нормально. У меня есть несколько общих функции, которые вызывает приложение. Также есть еще несколько функции(назовем их дочерними функциями), которые расположены в том же сегменте, что и общие функции и которые вызываются общими функциями. Сейчас установил цепочку "ловушек"(дергание ножками) при вызове одной из общих функций. Результат: подвисание происходить внутри общей функции при вызове дочерних функций, причем, разных дочерних. Ну, мне все-таки надо попытаться сделать работоспособным приложением, т.к. при компиляции приложения и загрузчика с исходными текстами общих функций я не укладываюсь в размеры памяти кристалла.
-
В IAR есть два отдельных проекта: приложение и загрузчик. Оба этих проекта используют несколько одинаковых функций. Из экономии памяти решил, в проекте загрузчика создать сегмент, куда поместить общие функции. А в проекте приложения в xcl файле указал адреса этих функций, чтобы можно было вызывать эти функции. Скомпилировал два проекта по отдельности, объединил прошивки - все работает, но не стабильно. Глючить начинает, когда приложение вызывает общие функции. Проекты компилировались с разными уровнями оптимизации: загрузчик - максимум по размеру, а приложение - среднее по размеру. Есть подозрение, что в этом и дело, надо разбираться, чем и занимаюсь. Попутно хочу спросить, каким образом люди решают подобные задачи? Применять одинаковые уровни оптимизации обоих проектов; не оптимизировать общие функции; использовать общие функции на ассемблере и т.д.
-
Я правильно понял, это то что Вы просили? OPTIONS.bmpbootloader.7z
-
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;
-
Прилагаю файлы iar430a.7z и iar520.7z В первом листинг, map, файл исходника с функцией main.c и *.xcl файл. Во втором только листинг и map.Iar430a.7zIar520.7z Iar430a.7z
-
1. Глюк в том, что получаю 0x78,0x12,0x12,0x00 ВМЕСТО 0x78,0x12,0x01,0x00. 2. А зачем sum.b присваивать? Я уже присвоил: sum.dw = (unsigned long)0x00011278;
-
Пишу загрузчик для 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 все работает нормально. Подтвердите, это глюк компилятора?
-
подкиньте примерчик написания функции прерывания для STM32. Что-то я не нашел *.h файла в папке IAR, где-бы определялись адреса векторов прерываний.
-
Достаточно много проектов сделано на ATmele(AVR,ARM) и как-то привык к startup, low_level_init и стилю, как там все организовано и описывается. Решил попробовать STM32. Поглядел примерчики под IAR. Все как-то необычно. Хотел бы услышать мнения и отзывы людей. которые используют STM32+IAR: используете ли функции/макросы (настройка таблицы векторов, настройка переферии и т.п.), которые есть примерах для IAR? Адаптируете их под себя(как удобней, как привыкли)? Создаете свои функции/макросы или где-то есть альтернатива?
-
В reference manual сходу не нашел: как посторен механизм защиты flash памяти? При программировании (JTAG) устанавливаются fuse или как?
-
Поделитесь впечатлениями от работы с STM32, Renesans, NEC: 1. Надежность контроллеров, помехоустойчивость; 2. Количество глюков, возникавшие трудности при работе с контроллерами. 3. Качество технической документации. 4. Какие средства разработки используете? Компилятор, отладчик. 5. Есть схемы программаторов? Желательно с USB интерфейсом.
-
как раз просматриваю их линейку.
-
скорость по CAN 500kbit. Задачи софтинки: 2 PID регулятора управления движками (+24VDC) через ШИМ, 7 каналов подергать ножками когда надо, 16 каналов данные с АЦП неспешно получать, ну и по CAN пообщаться с другими девайсами UPD78F1836GK, также был вариант из 78K0/FE2 (детально не изучал). Выбирал чтобы CAN был и не менее 12 каналов АЦП.
-
Управление МОП транзистором.
KSN опубликовал тема в В помощь начинающему
Затвор транзистора через последовательный резистор подключается к выходу микроконтроллера. Как правильно рассчитать номинал резистора? -
что касается NEC: 1. бесплатный программатор у них UART(это то, что я нашел), а есть вероятность программирования контроллера в "полевых условиях" с ноутбука, значит надо usb. 2. запрос на efind не нашел поставщиков контроллеров, которые мне подошли.
-
Подходит atmega32C1, но ее купить не так просто (снабженцы сказали). Можно AT91SAM7A3 взять, ну уж очень много ножек:) Поглядел на NEC, но это надо искать(покупать) софт, средства отладки и т.п. Есть сомнения, а стоит ли с ними заморачиваться? Посоветуйте, кто что может.
-
AD 8.0 и заводы по пр-ву ПП
KSN ответил _Ivan_ тема в Altium Designer, DXP, Protel
Так Вы обратитесь на конкретный завод с запросом в каком формате им необходимо предоставлять файлы трассировки и сверловки, и выяснить возможность AD сгенерировать файлы в требуемом формате. -
Сообщения на двух языках для вывода на индикатор
KSN ответил KSN тема в Программирование
Получается, что надо делать через #define. -
Сообщения на двух языках для вывода на индикатор
KSN ответил KSN тема в Программирование
Возможно, что я не ясно выразился: проблема не в выборе языка(переключения между ними), а в удобной и понятной форме записи вывода сообщения. Выбор языка: 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]); -
Сообщения на двух языках для вывода на индикатор
KSN опубликовал тема в Программирование
Вывожу текстовые сообщения на индикатор. Требуется выводить на русском, либо на английском языке. Первое что пришло в голову: 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. Есть идеи? -
Объясните связь настроек линковщика (распределение памяти, 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?
-
IARARM5.11 и AT91SAM7A3
KSN опубликовал тема в Программирование
Объясните связь настроек линковщика (распределение памяти, 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?