-
Постов
1 611 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Весь контент juvf
-
не помогло (( а в какой доке расписаны дерективы процессора, всякие __attribute__, прагмы и т.п.?
-
Выравнивание в NIOSII
juvf опубликовал тема в Системы на ПЛИС - System on a Programmable Chip (SoPC)
вот код char bufRecive[100]; alt_u16 countRxTx = 0x0025; *reinterpret_cast<alt_u16*>(&bufRecive[1]) = countRxTx; после этого bufRecive[0] равно 0х25, а bufRecive[1] равно 0х00. Сталкивался с такой проблемой в msp430 в IAR-e. Там нужно адрес массива bufRecive при объявлении выравнивать дерективой, типа #pragma aligment = 2 В Nios-e похоже тоже из-за выравнивания. Как тут массив выравнять? Или если не выравнивание, то что? Как побороть? -
Ага, таймера то у меня и не было в процессоре. Добавлю, проверю... Спасибо. Но про includes.h не понятно, что за файл и где он хранится? Кто его генерирует или от куда он берётся?
-
Nios ii + uC/OS-II
juvf опубликовал тема в Системы на ПЛИС - System on a Programmable Chip (SoPC)
кто нибудь пробовал поднять uc/os-ii на ниосе? Проблема такая: создаю проект New-> NIOS II Aplication and BSP from Template. Выбираю шаблон Hello MicroC/OS-II. Генерирую. В главном исходнике пявляется #include "includes.h". А где это включение? Open Dtclaration не открывает его. Пробовал собрать не собирается, пишет ./UCOSII/inc/ucos_ii.h:1708:2: error: #error "OS_CFG.H, Missing OS_TICKS_PER_SEC: Sets the number of ticks in one second" Наверно эти определения, OS_TICKS_PER_SEC ..., должны быть в includes.h, но где этот includes? Может его как-то сгенерировать нужно? -
Только через memory?! Больше ни как!? Скука какая..... А как узнать адрес регистра? Например есть в ниосе уарт. Вот что про него в system.h /* * uart_0 configuration * */ #define ALT_MODULE_CLASS_uart_0 altera_avalon_uart #define UART_0_BASE 0x1011000 #define UART_0_BAUD 115200 #define UART_0_DATA_BITS 8 #define UART_0_FIXED_BAUD 1 #define UART_0_FREQ 50000000u #define UART_0_IRQ 1 #define UART_0_IRQ_INTERRUPT_CONTROLLER_ID 0 #define UART_0_NAME "/dev/uart_0" #define UART_0_PARITY 'N' #define UART_0_SIM_CHAR_STREAM "" #define UART_0_SIM_TRUE_BAUD 0 #define UART_0_SPAN 32 #define UART_0_STOP_BITS 1 #define UART_0_SYNC_REG_DEPTH 2 #define UART_0_TYPE "altera_avalon_uart" #define UART_0_USE_CTS_RTS 0 #define UART_0_USE_EOP_REGISTER 0 как узнать адреса регистров control register и status register?
-
в теме вопрос. Остановился отладчиком в точке остановки. Нужно посмотреть статус регистр и регистр управления UART-а. Как это сделать в Eclipse?
-
что значит "файл устройства"? Это если я использую ос, например linux, то я там должен передать указатель на файл, например, /dev/tty0. А если ос нет? Если я пишу без ос и хочу написать обработчик прерывания от uart-a, что туда передавать? Как определить - нужен он мне или не нужен? Есть где-нибудь более полное описание этой функции?
-
alt_irq_register()?
juvf опубликовал тема в Системы на ПЛИС - System on a Programmable Chip (SoPC)
Не могу разобраться с функцией alt_irq_register(). Нашел в пдф "HAL API Reference" описание. что такое *contex? что туда подставлять и для чего он нужен? -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
Вроде уже поднимался такой вопрос, найти не могу. Что нужно хранить в репазитории проекта Altium? Какие файлы, что есть что в куче альтиумовских файлах? -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
у меня в месте схода стоит PAD TIE NET. Я его временно удалил, чтоб проблему решить. На рисунке соседний тайнет видно. Как создать правило для PAD TIE NET? Как сделать, чтоб на цепи, соединяющиеся в PAD TIE NET, DRC не ругался. -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
Могу. Создал класс, поместил туда цепи. А какое правило создавать? Ошибка такая [Clearance Constraint Violation] device1.PcbDoc Advanced PCB Clearance Constraint: Between Track (141.575mm,177.675mm)(142mm,178.1mm) Sig1 And Track (142mm,178.1mm)(146mm,182.1mm) Sig1 15:16:56 17.12.2010 19 правило сделал как на рисунке. Может я не то правило создаю? -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
:write: в схеме 2 цепи, объеденены через tainet. Физически это одна цепь. на пп две дорожки в одном слоес разними именми цепей сходятся в одной точке. DRC не проходит. Как настроить правила для таких дорожек? -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
требуется в полигонах сделать разрез. Добавил Fill в слой KeepOut и получил в этом месте разрез в полигонах во всех слоях. Но теперь DRC не проходит. Не могу правила настроить. Как сделать чтоб DRC не ругался, если я дорожку через этот keepout протащю? Или если пад на keepout залез? -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
А что отключенно? Я на вкладке Error Reporting все варнинги переключил в No report. И всё равно получал 2 предупреждения. "contains IO Pin and Output Pin objects" и "Unconnected Pin U1-A11 at 460,795". После отключения этих предупреждений на вкладке Сonnection Matrix предупреждения пропали. Востановил вкладку Error Reporting - предупреждений нет. -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
Как узнать какое правило выдает ворнинг при компеляции проекта? Например [Warning] Compiler CPU.SchDoc MISO_FRAM contains IO Pin and Output Pin objects (Pin U1-AA3) 14:52:51 14.12.2010 1 [Warning] Compiler CPU.SchDoc Unconnected Pin U1-A11 at 460,795 14:52:51 14.12.2010 2 [Warning] Compiler CPU.SchDoc RS0_RO contains IO Pin and Output Pin objects (Pin U1-AB14) 14:52:51 14.12.2010 3 Не перевод этих предупреждений, а какое правило выдает эти предупреждения? Нашел на соседней вкладке, после того как отключил все правила на вкладке Error reporting. -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
Мне перевод и смысл этих ворнингов понятен. Мне не понятно правило, которое их генерирует. Вот предупреждение [Warning] Compiler ADC.SchDoc Net PA_P has no driving source (Pin D19-2,Pin R58-2,Pin R74-2,Pin XP2-c3) 15:07:36 14.12.2010 22 Это ворнинг я получаю потому что у меня есть цепь без драйвера и в свойствах проекта на вкладке Error reperting отмечено правило выдавать ворнинг если ..... Net with no driving source. Какое правило выдает ворнинг на вышеуказанные предупреждения? -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
Как узнать какое правило выдает ворнинг при компеляции проекта? Например [Warning] Compiler CPU.SchDoc MISO_FRAM contains IO Pin and Output Pin objects (Pin U1-AA3) 14:52:51 14.12.2010 1 [Warning] Compiler CPU.SchDoc Unconnected Pin U1-A11 at 460,795 14:52:51 14.12.2010 2 [Warning] Compiler CPU.SchDoc RS0_RO contains IO Pin and Output Pin objects (Pin U1-AB14) 14:52:51 14.12.2010 3 -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
Открыл вашу пп. Не нашел я там антены как на вашем рисунке выше. Нашел всего одну антену, NetU2_5, ну её просто доразвести. Ругонь в районе Р5 тоже не нашел. Много ругони на другие вещи, на румы, на то что в некоторых переходках внутренний деаметр больше внешнего, на неразведённые цепи и т.п. -
FAQ по Altium Designer
juvf ответил masterofnature тема в Altium Designer, DXP, Protel
галочки нет - два незмкнутых проводника, галочка есть два соединения, физически это конечно один проводник, но УГО - два. мне нужно такое одно соединение -
Altium для новых начинающих
juvf ответил Uladzimir тема в Altium Designer, DXP, Protel
это означает "антена". Т.е. это дорожка идёт от пада и ни куда не приходит, в воздухе висит. На рисунке видно дорожку из двух сигментов. Нужно проверить чтоб оба сегмента дорожки имели одно и тоже имя цепи. Возможно что дорожка хоть и выглядит как 2-х сегментовая, но на самом деле там сегментов больше. Возможно антена не на этом слое, нужно проверить все слои. Ну если не разберётесь - пп в студию. -
FAQ по Altium Designer
juvf ответил masterofnature тема в Altium Designer, DXP, Protel
Из чаво У меня, если установленна галочка, то соединение не сохраняется. А преобразуется в два соединения. Как сделать чтоб соединение сохранялось? -
Нашел багу. В мэйне в одном месте застреваю на долго. :laughing: Всем спасибо! Ну я бы с нуля конечно писал бы по другому. Но что значит "лучше"? Переписать с нуля - это год минимум + год на тестирование. Мне нужно добавить не большой функционал к отлаженной программе, которая работает без сбоев уже годами в сотнях устройств. Лучше потратить 2 года на написание нового кода, чем неделю на нахождении баги, которую я сделал при добавлении нового функционала? Тем более что прога может общятся с кучей устройств, которых физически в данный момент нет. А с ними обмен тоже придется отлаживать. ps И всё же, на будущее, есть в msp430 что-то типа трассировки процесса? Или дерево вызова функций? Слышал что есть. Как бы это поднять? Хотелось бы остановится в брейкпоинте и увидеть что находишся в функции f1(), эта функция была вызвана из f2(), f2 была вызвана прерыванием от uart, прерывание прервало выполнение функции f3(), в момент прерывание выполнения f3 локальные переменные в f3 были такие и такие, регистры такие и такие ну и т.п.
-
а в чем тут бага? есть дефаин #define Value32kHz1sCCR 32768 //Константа для 1 с: кварц 32768 Гц / таймер 1 Гц = 32768. прерывание происходит при счетчике 0х0000 и 0х8000. раз в секунду попадаю в TIMERB1_VECTOR. После выхода из обработчика до..... проверки флага в главном цыкле иногда может пройти времени больше секунды. При чем входит в обработчик строго по расписанию, раз в сек. выполнение тоже достаточно быстро. Толи гдето в какойто другой обработчик ныряем, толи гдето в майне застреваем. Не могу понять где. А по поводу TIMERB0_VECTOR - это прерывание используется и там есть обработчик, не менее адский чем В1. Програvма большая, если что-то менять, то её всю с нуля нада переписывать. Хотелось бы с этой разобраться. Где шляемся? Как можно трассировку процесса организовать? Что за плагин Profiling? Он мне не поможет. По поводу второго вопроса: Если happy объявлен глобально так volatile MyClass happy; То при использовании её в потоке маин и в обработчике не нужно беспокоится о колизии при совместном доступе к happy? Там же оператор "=" вызывает копирующий конструктор, а это может быть тоже не лёгкая функция? Или компилятор сам запретит прерывания при вызове "="?
-
да вроде всё что нужно включено, всё что не нужно выключено. Может какой нибудь прерывание не нужное раз в 3 дня включается и процесс постоянно ныряет в него около минуты. потом опять всё нормально. Но я ме могу понять где процесс находится? в каком прерывании или где застревает в мэйне? И всё же, есть у кого-нибудь опыт трассировки процесса? Может кто-нибудь подсказать в какую сторону глянуть? Ну тут адский код. Черт ногу сломит. Но мож на вскидку кто увидет потенциальную багу. #pragma vector=TIMERB1_VECTOR __interrupt void TimerB_Int1(void) { switch(__even_in_range(TBIV, 14)) { case 2: break; //Прерывание по модулю сравнения 1 (Высший приоритет) case 4: TBCCTL2=0; InvalidIntCNT++; return; case 6: TBCCTL3=0; InvalidIntCNT++; return; case 8: TBCCTL4=0; InvalidIntCNT++; return; case 10: TBCCTL5=0; InvalidIntCNT++; return; case 12: TBCCTL6=0; InvalidIntCNT++; return; case 14: Tic2sCounter++; return; //Прерывание по переполнению таймера B. Период 32768/65536=0.5 Гц (2 с) default: return; } TBCCR1+=Value32kHz1sCCR; //Цифровая коррекция хода часов //Изменение на 3 такта каждые 79 сек дает 0,1 сек/сут if(++DTC79Cnt>=79) { DTC79Cnt=0; TBCCR1-=(EEPROM.RTC_Correct*3)-60; //60 - отставание на 2 сек/сут } //Если нужно, считаем длительность заряда АКБ if(ChargeCnt) if(gFlags.ExtPower) { if(++ChargeSticks>4) ChargeSticks=0; if(!--ChargeCnt) EndCharge(); } if(P3State != P3_Off) { //Если нужно, считаем секундный тайм-аут if(Sec_TimeOut) --Sec_TimeOut; //Если нужно, проверим время автовыключения if(gFlags.ExtPower) {AutoOffCnt=EEPROM.AutoOff; BLAutoOffCnt=EEPROM.BLAutoOff;} else{ if(AutoOffCnt) if(!--AutoOffCnt) gFlags.AutoOff=1; if(BLAutoOffCnt) if(!--BLAutoOffCnt) InitBackLight(); } //Синхронизируем индикацию с часами if((Cnt20ms>1) && (Cnt20ms<18)) Cnt20ms++; if((Cnt1S>1) && (Cnt1S<48)) Cnt1S++; } //Если идет ожидание окончания измерения, считать секунды if(MeasWait) MeasWait--; //Если часы остановлены, выход if(gFlags.ClockStop) return; _EINT(); //Прибавление секунды к текущему времени //NewSec++; if( GsmCheckTimeOut != 0) --GsmCheckTimeOut; ++CurDT.Sec; if((CurDT.Sec >= 1) && gFlags.TimeBeginConnect) { gFlags.TimeBeginConnect = 0; //PORT_UART_PC &= ~Bit_UART_PC_FOF;//порт сбросим для наблюдения в осцилографе } #ifdef RADIO if(CurDT.Sec == 58) {//включим питание RFD21733 UARTAdOn(); Power4On(); } #endif //if(CurDT.Sec == 3)///!!! // CurDT.Sec = 56; if(CurDT.Sec>59) { CurDT.Sec=0; //Если есть нормальное питание (EP2), проснуться if(!PowerIsLi()) { _BIC_SR_IRQ(LPM3_bits); InitUART1(); IdleDelay=1; } BCSCTL1 &= ~XT2OFF; BCSCTL2 |= SELS; gFlags.TimeBeginConnect = 1; gFlags.isTest = 1; BeginSysTimer(); //сброс дебажного счетчика gFlags.Synchronization = 1; if(--timeCheckBattary == 0) { gFlags.CheckBattary = 1; // флаг проверки батареи timeCheckBattary = 10; } //PORT_UART_PC |= Bit_UART_PC_FOF; if(++CurDT.Min>59) { CurDT.Min=0; if(++CurDT.Hour>23) { CurDT.Hour=0; CurDT.Day++; if(CurDT.Day>CalcDayInMonth(&CurDT)) { //Месяц закончился CurDT.Day=1; if(++CurDT.Month>12) { CurDT.Month=1; CurDT.Year++; } } } } } //Проверка будильника if((AlarmAct != AA_Off) && //Будильник включен, (AlarmAct != AA_ProcStop) && //Не требуется окончание процесса (*(WORD*)&AlarmDT.Sec==*(WORD*)&CurDT.Sec) && //..секунды, минуты совпадают,.. (*(WORD*)&AlarmDT.Hour==*(WORD*)&CurDT.Hour) && //..час, день,.. (*(WORD*)&AlarmDT.Month==*(WORD*)&CurDT.Month)) //..месяц, год { //Будильник сработал, установить флаг regFlags.Alarm=1; MeasStep=MS_Wait; //Если есть нормальное питание (EP2), проснуться if(!PowerIsLi()) {_BIC_SR_IRQ(LPM3_bits); IdleDelay=1;} //При отсутствии нормального питания установить флаг потенциальной ошибки else {InitPower(); regFlags.PotencError=1;} } //Если при отсутствии нормального питания (EP2) разрешено включение, разобраться if((IE_PowerIn & Bit_PowerIn) && PowerIsLi()) {InitPower(); _BIC_SR_IRQ(LPM3_bits); regFlags.PotencError=1;} //Программный WDT if((P3State != P3_Off) && !--SoftWDT) {regFlags.PotencError=1; regFlags.ResultWrite=0; WarmReset();} asm("nop"); msTime[0] = EndSysTimer(); фиксация дебажного счетчика } А вот еще возник вопрос, может здесь грабля лежит. Как работает "многопоточность" в мсп430 + иар? например есть код и есть обработчик прерывания ///main.cpp bool happy; int main() { happy = false; while(1) { if(happy) { divHappySmb(); happy = false; } } } //обработчик прерывания #pragma vector=TIMERB1_VECTOR __interrupt void TimerB_Int1() { happy = checkMyMoney(); } так вот, крутимся постоянно в main. по прерываниям порадаем в TimerB_Int1(). Можно сказать что тут 2 потока - главный и обработчик прерывания. Но ни какой системы синхранизации. Допустим мэйне мы читаем или пишим happy, в это время происходит прерывание. прцессор передает управление обработчику, сохраняется "портрет" состояния мэин и выполняется обработчик TimerB_Int1(). Потом востанавливается картина и передается управление мэйну. Так вот получается как-бы одновременное обращение из двух "потоков" к переменной happy. Не косяк ли это? может ли оператор "=" быть прерван по среди выполнения? Понятно, что оператор "=" для bool скорее всего одна инструкция и её прервать на середине невозможно, но если happy это int, или какойнибудь тяжелый class MyHappyClass? Нужно ли защищять переменные в мэйне, которые используются в прерывании, типа int main() { happy = false; while(1) { dInt();//запрет прерывания if(happy) { eInt();//разрешение прерывания divHappySmb(); dInt();//запрет прерывания happy = false; } eInt();//разрешение прерывания } }
-
MSP430F2418 есть в мэйне основной цыкл while(1). в теле цыкла вызываются всякие процедуры и функции которые по глобальным флагам делают те или иные действия. Есть обработчик прерываний который прерывает этот вайл и выставляет всякие флажки, которые обрабатываются в главном цыкле. обычно цыкл прохонит за несколько мс с учётом времени потраченное в перываниях. но иногда процесс где-то шляется больше секунды. в обработчике прерывания выставляю флаг. в главном цыкле должен по этому флагу запустить процедуру. так вот между выставлением флага в прерывании и проыеркой этого флага в гл. цыкле может пройти больше секунды. из прерывания выход мгновенный. 100%. а вот где потом процесс шляется целую секунду не могу найти. узнать бы в каком месте была прервана программа прерыванием и куда вернулась? Как бы трассировкку процесса устроить? Как это можно решить с помошью IAR EW IDE? или какими еще способами можно выяснить где мы были целую секунду?