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

juvf

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    2

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


  1. не помогло (( а в какой доке расписаны дерективы процессора, всякие __attribute__, прагмы и т.п.?
  2. вот код 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 похоже тоже из-за выравнивания. Как тут массив выравнять? Или если не выравнивание, то что? Как побороть?
  3. Ага, таймера то у меня и не было в процессоре. Добавлю, проверю... Спасибо. Но про includes.h не понятно, что за файл и где он хранится? Кто его генерирует или от куда он берётся?
  4. кто нибудь пробовал поднять 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? Может его как-то сгенерировать нужно?
  5. Только через 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?
  6. в теме вопрос. Остановился отладчиком в точке остановки. Нужно посмотреть статус регистр и регистр управления UART-а. Как это сделать в Eclipse?
  7. что значит "файл устройства"? Это если я использую ос, например linux, то я там должен передать указатель на файл, например, /dev/tty0. А если ос нет? Если я пишу без ос и хочу написать обработчик прерывания от uart-a, что туда передавать? Как определить - нужен он мне или не нужен? Есть где-нибудь более полное описание этой функции?
  8. Не могу разобраться с функцией alt_irq_register(). Нашел в пдф "HAL API Reference" описание. что такое *contex? что туда подставлять и для чего он нужен?
  9. Вроде уже поднимался такой вопрос, найти не могу. Что нужно хранить в репазитории проекта Altium? Какие файлы, что есть что в куче альтиумовских файлах?
  10. у меня в месте схода стоит PAD TIE NET. Я его временно удалил, чтоб проблему решить. На рисунке соседний тайнет видно. Как создать правило для PAD TIE NET? Как сделать, чтоб на цепи, соединяющиеся в PAD TIE NET, DRC не ругался.
  11. Могу. Создал класс, поместил туда цепи. А какое правило создавать? Ошибка такая [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 правило сделал как на рисунке. Может я не то правило создаю?
  12. :write: в схеме 2 цепи, объеденены через tainet. Физически это одна цепь. на пп две дорожки в одном слоес разними именми цепей сходятся в одной точке. DRC не проходит. Как настроить правила для таких дорожек?
  13. требуется в полигонах сделать разрез. Добавил Fill в слой KeepOut и получил в этом месте разрез в полигонах во всех слоях. Но теперь DRC не проходит. Не могу правила настроить. Как сделать чтоб DRC не ругался, если я дорожку через этот keepout протащю? Или если пад на keepout залез?
  14. А что отключенно? Я на вкладке Error Reporting все варнинги переключил в No report. И всё равно получал 2 предупреждения. "contains IO Pin and Output Pin objects" и "Unconnected Pin U1-A11 at 460,795". После отключения этих предупреждений на вкладке Сonnection Matrix предупреждения пропали. Востановил вкладку Error Reporting - предупреждений нет.
  15. Как узнать какое правило выдает ворнинг при компеляции проекта? Например [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.
  16. Мне перевод и смысл этих ворнингов понятен. Мне не понятно правило, которое их генерирует. Вот предупреждение [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. Какое правило выдает ворнинг на вышеуказанные предупреждения?
  17. Как узнать какое правило выдает ворнинг при компеляции проекта? Например [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
  18. Открыл вашу пп. Не нашел я там антены как на вашем рисунке выше. Нашел всего одну антену, NetU2_5, ну её просто доразвести. Ругонь в районе Р5 тоже не нашел. Много ругони на другие вещи, на румы, на то что в некоторых переходках внутренний деаметр больше внешнего, на неразведённые цепи и т.п.
  19. галочки нет - два незмкнутых проводника, галочка есть два соединения, физически это конечно один проводник, но УГО - два. мне нужно такое одно соединение
  20. это означает "антена". Т.е. это дорожка идёт от пада и ни куда не приходит, в воздухе висит. На рисунке видно дорожку из двух сигментов. Нужно проверить чтоб оба сегмента дорожки имели одно и тоже имя цепи. Возможно что дорожка хоть и выглядит как 2-х сегментовая, но на самом деле там сегментов больше. Возможно антена не на этом слое, нужно проверить все слои. Ну если не разберётесь - пп в студию.
  21. Из чаво У меня, если установленна галочка, то соединение не сохраняется. А преобразуется в два соединения. Как сделать чтоб соединение сохранялось?
  22. Нашел багу. В мэйне в одном месте застреваю на долго. :laughing: Всем спасибо! Ну я бы с нуля конечно писал бы по другому. Но что значит "лучше"? Переписать с нуля - это год минимум + год на тестирование. Мне нужно добавить не большой функционал к отлаженной программе, которая работает без сбоев уже годами в сотнях устройств. Лучше потратить 2 года на написание нового кода, чем неделю на нахождении баги, которую я сделал при добавлении нового функционала? Тем более что прога может общятся с кучей устройств, которых физически в данный момент нет. А с ними обмен тоже придется отлаживать. ps И всё же, на будущее, есть в msp430 что-то типа трассировки процесса? Или дерево вызова функций? Слышал что есть. Как бы это поднять? Хотелось бы остановится в брейкпоинте и увидеть что находишся в функции f1(), эта функция была вызвана из f2(), f2 была вызвана прерыванием от uart, прерывание прервало выполнение функции f3(), в момент прерывание выполнения f3 локальные переменные в f3 были такие и такие, регистры такие и такие ну и т.п.
  23. а в чем тут бага? есть дефаин #define Value32kHz1sCCR 32768 //Константа для 1 с: кварц 32768 Гц / таймер 1 Гц = 32768. прерывание происходит при счетчике 0х0000 и 0х8000. раз в секунду попадаю в TIMERB1_VECTOR. После выхода из обработчика до..... проверки флага в главном цыкле иногда может пройти времени больше секунды. При чем входит в обработчик строго по расписанию, раз в сек. выполнение тоже достаточно быстро. Толи гдето в какойто другой обработчик ныряем, толи гдето в майне застреваем. Не могу понять где. А по поводу TIMERB0_VECTOR - это прерывание используется и там есть обработчик, не менее адский чем В1. Програvма большая, если что-то менять, то её всю с нуля нада переписывать. Хотелось бы с этой разобраться. Где шляемся? Как можно трассировку процесса организовать? Что за плагин Profiling? Он мне не поможет. По поводу второго вопроса: Если happy объявлен глобально так volatile MyClass happy; То при использовании её в потоке маин и в обработчике не нужно беспокоится о колизии при совместном доступе к happy? Там же оператор "=" вызывает копирующий конструктор, а это может быть тоже не лёгкая функция? Или компилятор сам запретит прерывания при вызове "="?
  24. да вроде всё что нужно включено, всё что не нужно выключено. Может какой нибудь прерывание не нужное раз в 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();//разрешение прерывания } }
  25. Трассировка процесса

    MSP430F2418 есть в мэйне основной цыкл while(1). в теле цыкла вызываются всякие процедуры и функции которые по глобальным флагам делают те или иные действия. Есть обработчик прерываний который прерывает этот вайл и выставляет всякие флажки, которые обрабатываются в главном цыкле. обычно цыкл прохонит за несколько мс с учётом времени потраченное в перываниях. но иногда процесс где-то шляется больше секунды. в обработчике прерывания выставляю флаг. в главном цыкле должен по этому флагу запустить процедуру. так вот между выставлением флага в прерывании и проыеркой этого флага в гл. цыкле может пройти больше секунды. из прерывания выход мгновенный. 100%. а вот где потом процесс шляется целую секунду не могу найти. узнать бы в каком месте была прервана программа прерыванием и куда вернулась? Как бы трассировкку процесса устроить? Как это можно решить с помошью IAR EW IDE? или какими еще способами можно выяснить где мы были целую секунду?
×
×
  • Создать...