jcxz
Свой-
Постов
13 830 -
Зарегистрирован
-
Посещение
-
Победитель дней
38
Весь контент jcxz
-
Наверно мы с вами живём в разные времена ;) Во-первых: а если этот ваш мелкий зависнет, что делать? ;) Можно сделать и так, но поставив внешний WD на этого мелкого. Во-вторых: не весь парк электроники состоит из лэптопов и жирных роутеров. Есть ещё более мелкая электроника, где цена каждого чипа и их кол-во имеет значение. И такой электроники думаю существенно больше чем жирной. А также ещё учтите что, так как становится на один программируемый компонент больше, то при этом увеличивается стоимость и сроки разработки, кол-во багов, сложности если необходимо удалённое обновление ПО и т.п. Обоснуйте. Если есть. Никто не спорит. Только не забывайте - чем более интеллектуальный, тем более подвержен зависонам. Как вы его отвешивать будете? :) Сколько Вам ST платит? ;) В этих ST, о которых Вы говорите, WD по умолчанию после сброса в каком состоянии? Включен? Вот именно что в "консьюмерских". Там где всегда рядом есть юзер. На него и возлагаются обязанности собаки ;) А если ваш девайс находится в труднодоступном месте (или вообще недоступном - не дай бог - на Марсе ;) ), кто его пересбросит? А сейчас вообще трудно встретить компетентных разработчиков. Мало осталось. Поэтому у нас спутники и падают.
-
Как раз специально для Вас я написал комменты ;) Обратите внимание на s32 c; и на (u32)c и подумайте. Там три ветви условного выполнения. PS: Вобщем - это явный баг оптимизатора. Причём новый, появившийся с версии 6 IAR (в версии 5.50 всё было ок) :(((((((
-
Разработчик встроенного ПО C/ARM (Москва)
jcxz ответил sergey.s тема в Предлагаю работу
Эх, пошёл-бы я к Вам! Люблю я это: Жаль - Вы далеко.... :( -
Фрам - вещь довольно дорогая, да и часы с погрешностью +-2ppm от всех факторов - тоже. Но к сожалению они почему-то не уживаются в одном корпусе :(
-
Имхо - самый главный плюс внешнего по сравнению с внутренним - это то что его невозможно отключить. Ведь внутренний обычно нужно сперва разрешить после сброса. А у помех есть такое скотское свойство - ходить пачками. Т.е. - скажем если по первому импульсу из пачки помех у вас происходит пересброс проца, то если второй импульс пачки придёт раньше, чем вы успеете программно разрешить внутренний WD, то устройству обеспечен мёртвый зависон. Т.е. - оно не соответствует требованиям ГОСТ по помехоустойчивости. Мы в своих устройствах ОБЯЗАТЕЛЬНО и ВСЕГДА ставим внешний WD. Причём обязательно такой, который нельзя программно отключить никакими комбинациями сигналов. Имхо - внутренний имеет смысл использовать только для быстрого аппаратного сброса CPU, не более.
-
Спасибо :) У Вас баг также наличествует: 82 if (c >= 0) i += 1; \ ??TBug_10: \ 000000A2 0x1C64 ADDS R4,R4,#+1 То же самое безусловное выполнение :((( Хотя пришла мысль - пожалуй надо будет глянуть раздел настроек проекта касательно MISRA-C..... У меня здесь везде используется арифметика с переполнением разрядной сетки, там вроде были какие-то ограничения оптимизатора насчёт этого. Это не шедевр, это всего лишь часть кода отвечающая за подстройку частоты внутреннего таймера тактируемого от PLL LPC1788, под частоту внешних импульсов от внешнего RTC. Подстройка методом ФАПЧ. :)
-
Где заведомо? Вы что-то путаете ;) А Вы видите if (i < 2) немного выше и c = shiftMs; ? Да, кстати, Вы совершенно правы - при минимизации исходника и обрезки всего, перепутал тип adjTim. Он в оригинале: s16. Но это роли не играет. Так как значение c может быть присвоено ранее. Вобщем, по алгоритму, на входе в злополучное сравнение, переменная c может принимать любое значение из диапазона: -2^31...2^31-1. А насчёт жуткости - Вы видимо не видели по настоящему жутких исходников ;) Ближе к телу: Вы пробовали скомпилить это на Вашем компиляторе?
-
Видно: 561 stateTIM = i; \ ??TBug_11: \ 000000B8 0C70 STRB R4,[R1, #+0]
-
Создал пустой проект, скомпилил, цепляю сюда аттачем. SRC.2.ZIP Во-первых: используется, смотрите внимательнее. Во-вторых: не выкинул, а сделал безусловным, смотрите внимательнее.
-
Да, Ваш и у меня правильно компилится. И если мою функцию урезать - тоже начинает правильно. Но в изначальном виде - баг! Приведу функцию в исходном виде (почти как у меня в рабочем варианте). Извините что так много, но при урезании функции начинает нормально компилить. %-\ #define WATCH_BASE_CLK 1000000 //[Hz] дискретность nTIM_watch #define T_ADJ 16 //разрядность фильтра джиттера ISR RTC typedef signed char s8; typedef signed short s16; typedef signed int s32; typedef signed long long s64; typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; enum { SHIFT_STATE_INIT, SHIFT_STATE_IDLE, SHIFT_STATE_REQ, SHIFT_STATE_ACT, SHIFT_STATE_REPORT, SHIFT_STATE_SYNC}; u32 volatile shadowRTC; u32 shiftPoint, pointTIM; u16 adjTim; u8 stateTIM = 0; u8 shiftState; s8 shiftSec; s32 shiftMs; typedef struct { u32 IR; u32 TCR; u32 TC; u32 PR; u32 PC; u32 MCR; u32 MR[4]; u32 CCR; u32 CR[2]; u32 unuse0[2]; u32 EMR; u32 unuse1[12]; u32 CTCR; } HwRegsTIMER; __no_init extern volatile HwRegsTIMER TIMER_0 @ ".HwRegsTIMER0"; u32 GetMcsTimer() { return TIMER_0.TC; } extern "C" void TBug() { static s8 secAdd; u32 i, j = GetMcsTimer(); s32 c, cc; volatile HwRegsTIMER *p = &TIMER_0; p->IR = 2; switch (i = stateTIM) { case 12: stateTIM = 11; return; case 10: case 2: if ((c = p->MR[1] - WATCH_BASE_CLK / 2) < 0) c += WATCH_BASE_CLK; p->MR[1] = c; stateTIM = i + 1; return; case 11: shiftState = SHIFT_STATE_REPORT; // PingWatch(); case 3: shadowRTC += secAdd; if (stateTIM = i >>= 3) break; case 0: if (shiftPoint == shadowRTC + 1 && shiftState == SHIFT_STATE_REQ) { shiftState = SHIFT_STATE_ACT; c = shiftMs; cc = shiftSec; i = 10; } case 1: if (i < 2) { stateTIM = 0; if (adjTim & (1 << T_ADJ - 1) - 1) { c = adjTim; adjTim = cc = 0; i = 2; } else break; } secAdd = cc; if ((u32)c < WATCH_BASE_CLK / 10) { if ((c += p->MR[1] - WATCH_BASE_CLK / 2) < 0) c += WATCH_BASE_CLK; p->MR[1] = c; } else { if (c >= 0) i += 1; if ((c += p->MR[1]) < 0) c += WATCH_BASE_CLK; if (c >= WATCH_BASE_CLK) c -= WATCH_BASE_CLK; p->MR[1] = c; i += 1; } stateTIM = i; } pointTIM = j; shadowRTC++; /// PostEventRTC(); } Вот что получается (см. метки ??TBug_9 и ??TBug_10): 513 extern "C" void TBug() 514 { \ TBug: \ 00000000 F8B5 PUSH {R3-R7,LR} 515 static s8 secAdd; 516 u32 i, j = GetMcsTimer(); \ 00000002 ........ BL _Z11GetMcsTimerv 517 s32 c, cc; 518 volatile HwRegsTIMER *p = &TIMER_0; 519 p->IR = B1; \ 00000006 .... LDR.N R2,??DataTable67_11 \ 00000008 0221 MOVS R1,#+2 \ 0000000A 1160 STR R1,[R2, #+0] 520 switch (i = stateTIM) { \ 0000000C .... LDR.N R1,??DataTable67_12 \ 0000000E 0C78 LDRB R4,[R1, #+0] \ 00000010 0C2C CMP R4,#+12 \ 00000012 52D8 BHI.N ??TBug_1 \ 00000014 DFE804F0 TBB [PC, R4] \ ??TBug_0: \ 00000018 1E2D0A15 DC8 0x1E,0x2D,0xA,0x15 \ 0000001C 51515151 DC8 0x51,0x51,0x51,0x51 \ 00000020 51510A13 DC8 0x51,0x51,0xA,0x13 \ 00000024 0700 DC8 0x7,0x0 521 case 12: stateTIM = 11; return; \ ??TBug_2: \ 00000026 0B20 MOVS R0,#+11 \ ??TBug_3: \ 00000028 0870 STRB R0,[R1, #+0] \ 0000002A F1BD POP {R0,R4-R7,PC} 522 case 10: 523 case 2: 524 if ((c = p->MR[1] - WATCH_BASE_CLK / 2) < 0) c += WATCH_BASE_CLK; \ ??TBug_4: \ 0000002C D069 LDR R0,[R2, #+28] \ 0000002E .... LDR.N R3,??DataTable67_13;; 0xfff85ee0 \ 00000030 1B18 ADDS R3,R3,R0 \ 00000032 44BF ITT MI \ 00000034 .... LDRMI.N R0,??DataTable67_2;; 0xf4240 \ 00000036 C318 ADDMI R3,R0,R3 525 p->MR[1] = c; \ 00000038 D361 STR R3,[R2, #+28] 526 stateTIM = i + 1; \ 0000003A 601C ADDS R0,R4,#+1 \ 0000003C F4E7 B.N ??TBug_3 527 return; 528 case 11: 529 shiftState = SHIFT_STATE_REPORT; \ ??TBug_5: \ 0000003E 0426 MOVS R6,#+4 \ 00000040 4E70 STRB R6,[R1, #+1] 530 // PingWatch(); 531 case 3: 532 shadowRTC += secAdd; \ ??TBug_6: \ 00000042 8E68 LDR R6,[R1, #+8] \ 00000044 91F90270 LDRSB R7,[R1, #+2] \ 00000048 BE19 ADDS R6,R7,R6 \ 0000004A 8E60 STR R6,[R1, #+8] 533 if (stateTIM = i >>= 3) break; \ 0000004C E408 LSRS R4,R4,#+3 \ 0000004E 0C70 STRB R4,[R1, #+0] \ 00000050 0E78 LDRB R6,[R1, #+0] \ 00000052 96BB CBNZ.N R6,??TBug_1 534 case 0: 535 if (shiftPoint == shadowRTC + 1 && shiftState == SHIFT_STATE_REQ) { \ ??TBug_7: \ 00000054 CE68 LDR R6,[R1, #+12] \ 00000056 8F68 LDR R7,[R1, #+8] \ 00000058 7F1C ADDS R7,R7,#+1 \ 0000005A BE42 CMP R6,R7 \ 0000005C 09D1 BNE.N ??TBug_8 \ 0000005E 4E78 LDRB R6,[R1, #+1] \ 00000060 022E CMP R6,#+2 \ 00000062 06D1 BNE.N ??TBug_8 536 shiftState = SHIFT_STATE_ACT; \ 00000064 0323 MOVS R3,#+3 \ 00000066 4B70 STRB R3,[R1, #+1] 537 c = shiftMs; \ 00000068 4B69 LDR R3,[R1, #+20] 538 cc = shiftSec; \ 0000006A 91F90650 LDRSB R5,[R1, #+6] 539 i = 10; \ 0000006E 0A24 MOVS R4,#+10 \ 00000070 09E0 B.N ??TBug_9 540 } 541 case 1: 542 if (i < 2) { \ ??TBug_8: \ 00000072 022C CMP R4,#+2 \ 00000074 07D2 BCS.N ??TBug_9 543 stateTIM = 0; \ 00000076 0023 MOVS R3,#+0 \ 00000078 0B70 STRB R3,[R1, #+0] 544 if (adjTim & (1 << T_ADJ - 1) - 1) { \ 0000007A 8B88 LDRH R3,[R1, #+4] \ 0000007C 5C04 LSLS R4,R3,#+17 \ 0000007E 1CD0 BEQ.N ??TBug_1 545 c = adjTim; 546 adjTim = cc = 0; \ 00000080 0025 MOVS R5,#+0 \ 00000082 8D80 STRH R5,[R1, #+4] 547 i = 2; \ 00000084 0224 MOVS R4,#+2 548 } else break; 549 } 550 secAdd = cc; \ ??TBug_9: \ 00000086 8D70 STRB R5,[R1, #+2] 551 if ((u32)c < WATCH_BASE_CLK / 10) { \ 00000088 .... LDR.N R5,??DataTable67_14;; 0x186a0 \ 0000008A AB42 CMP R3,R5 \ 0000008C 08D2 BCS.N ??TBug_10 552 if ((c += p->MR[1] - WATCH_BASE_CLK / 2) < 0) c += WATCH_BASE_CLK; \ 0000008E D569 LDR R5,[R2, #+28] \ 00000090 EB18 ADDS R3,R5,R3 \ 00000092 .... LDR.N R5,??DataTable67_13;; 0xfff85ee0 \ 00000094 EB18 ADDS R3,R5,R3 \ 00000096 44BF ITT MI \ 00000098 .... LDRMI.N R5,??DataTable67_2;; 0xf4240 \ 0000009A EB18 ADDMI R3,R5,R3 553 p->MR[1] = c; \ 0000009C D361 STR R3,[R2, #+28] \ 0000009E 0BE0 B.N ??TBug_11 554 } else { 555 if (c >= 0) i += 1; \ ??TBug_10: \ 000000A0 641C ADDS R4,R4,#+1 556 if ((c += p->MR[1]) < 0) c += WATCH_BASE_CLK; \ 000000A2 D569 LDR R5,[R2, #+28] \ 000000A4 EB18 ADDS R3,R5,R3 \ 000000A6 .... LDR.N R5,??DataTable67_2;; 0xf4240 \ 000000A8 48BF IT MI \ 000000AA EB18 ADDMI R3,R5,R3 557 if (c >= WATCH_BASE_CLK) c -= WATCH_BASE_CLK; \ 000000AC AB42 CMP R3,R5 \ 000000AE A4BF ITT GE \ 000000B0 .... LDRGE.N R5,??DataTable67_5;; 0xfff0bdc0 \ 000000B2 EB18 ADDGE R3,R5,R3 558 p->MR[1] = c; \ 000000B4 D361 STR R3,[R2, #+28] 559 i += 1; \ 000000B6 641C ADDS R4,R4,#+1 560 } 561 stateTIM = i; \ ??TBug_11: \ 000000B8 0C70 STRB R4,[R1, #+0] 562 } 563 pointTIM = j; \ ??TBug_1: \ 000000BA 0861 STR R0,[R1, #+16] 564 shadowRTC++; \ 000000BC 8868 LDR R0,[R1, #+8] \ 000000BE 401C ADDS R0,R0,#+1 \ 000000C0 8860 STR R0,[R1, #+8] 565 /// PostEventRTC(); 566 } \ 000000C2 F1BD POP {R0,R4-R7,PC} ;; return Можете это попробовать скомпилить? Скопировал сюда вроде все необходимые define и определения типов.
-
Имеем (Cortex-M3): s32 c; //signed int if ((u32)c < 100000) { //проверка как unsigned int ... } else { if (c >= 0) i += 1; //проверка как signed int i += 1; } После компиляции с полной оптимизацией получаем бред: ;if ((u32)c < 100000) { LDR.W R0,??DataTable21_14;; 0x186a0 CMP R5,R0 BCS.N ??isrTIMER1_13 ... B.N ??isrTIMER1_14 ;} else { ; if (c >= 0) i += 1; ??isrTIMER1_13: ADDS R0,R4,#+1;почему безусловно??? Где IT??? ... ; i += 1; ADDS R4,R0,#+1 ;} ??isrTIMER1_14: ... Куда делось условное исполнение: if (c >= 0) i += 1; ???? Если поставить оптимизацию "Low", то всё нормально - эта строка выполняется по условию (с помощью команд перехода). При компиляции V5.50.0.51878/W32 for ARM тоже всё ок - строка выполняется условно (с помощью команды IT). IAR-цы добавили новый баг в оптимизатор? У кого есть IAR более новый - можете проверить - исправлено это или ещё нет?
-
"Там" это форум по FPGA. Имхо - Вам скорее на FPGA чем DSP. Сомневаюсь что возможно организовать какую-либо более-менее насыщенную обработку на DSP на 400 мегасэмлах/сек. Проблема даже будет уже с вводом/выводом такого потока на DSP.
-
И важный вопрос - куда командировки? 2 месяца на берегу моря Лаптевых != 2 месяца на берегу Средиземного моря. :)
-
Это постоянный поток или кратковременный? Вы поделите MFLOPS-ы какого-нить DSP на 400e6 и подумайте - сможете за такое кол-во тактов на сэмпл реализовать? И по какому интерфейсу Вы собираетесь загружать/выгружать в DSP 4.8 ГБит/сек? Имхо - Вы ошиблись форумом. Вам надо сюда: :) http://electronix.ru/forum/index.php?showforum=15
-
Очень интересный способ. Надо взять на заметку. Давно искал что-то подобное. Применение? Часто бывает нужно например иметь массив структур-описателей каких-то объектов и иметь возможность в каких-то случаях работать со всем этим массивом (в цикле к примеру) или работать с отдельными элементами (но проименованными через enum). Приходилось писать что типа: struct {...} static const m[] = {{...}, {...}, {...}, {...}, {...}}; enum {OBJ_A, OBJ_B, OBJ_C, OBJ_D, OBJ_E}; Причём - enum бывает нужно в хидере расположить, а массив - в cpp. Получается что видимой явной связи между m[] и enum нет и в дальнейшем при добавлении/удалении элементов m[] можно легко забыть отредактировать enum, да и отсчитывать номер элемента тож неудобно. Так что - спасибо за инфу, возьму на заметку. :)
-
LPC17xx. Использование банка памяти AHB
jcxz ответил an.skornyakov тема в ARM
Тогда дело определённо не в IAR-е или компоновщике. Что-то с железом. Я честно говоря в своём проекте в LPC1778 этот регион только прописал, но ещё не использовал. Думаю надо читать UM на семейство - возможно надо включить какие-то биты конфигурации или наоборот - отключить какую-то периферию, или сконфигурить частоту или регистры защиты от записи. Надо искать ответ в UM, а не в IAR. -
Спасибо! У него всё получилось :)
-
OMAP-L137 + old SAU510 (no ISO)
jcxz опубликовал тема в Сигнальные процессоры и их программирование - DSP
Необходимо подключить старый SAU510 USB (не ISO) к рабочей плате на L137. Проблема возникла у моего иностранного товарища, он не знает русского и просил меня спросить сюда. У меня новый SAU510 ISO PLUS и с ним эта плата работает нормально. Как я понимаю - с моим .ccs-файлом старый SAU510 работать не будет (и не работает). Я попробовал самостоятельно создать .ccs-файл для старого SAU510, но не знаю - правильно-ли? Старался делать по аналогии с моей конфигурацией. Выкладываю его сюда с просьбой знающим людям (особенно SAURIS GmbH ;) проверить - правильно-ли? sau510.zip Или может кто работает с L137 через такой JTAG и может прислать мне свой .ccs-файл? -
По-моему для веб-морды не нужна быстрая память, даже скорее без разницы какая будет. Хоть вообще LPC1778FBD144 + SRAM. А если она ещё и без жирной графики, то для означенной задачи можно вообще внутренними 96K вполне обойтись. Для означенного без графики думаю и 32К внутренней хватило-бы за глаза.
-
LPC17xx. Использование банка памяти AHB
jcxz ответил an.skornyakov тема в ARM
Выдержка из map-файла для _aImgBuffer ? А также - для EXTRARAM ? Запись *(uint8 *)0x2008C000 = x; работает? -
Если нет проблем с местом, то какая разница? Вы кста не привели требований по объёму RAM. Или надо именно 512M? В LPC1778 96KB внутренней. Мы сейчас используем LPC1778FBD144 для разрабатываемого изделия - очень нравится ;)
-
LPC17xx. Использование банка памяти AHB
jcxz ответил an.skornyakov тема в ARM
Приведите описание буфера из исходников, а также - размещение этого буфера из map-файла. Пока же видно, что в USB_RAM_region у вас помещается только секция EXTRARAM. Секция USB_RAM у вас помещается в EXT_RAM_region. В какую секцию вы компилите буфер? -
Почти да не почти - в CCS не поддерживается.
-
Да - нужен или монитор питания (с прерыванием по пропаданию) или в два раза больше non-volatile памяти для дублирования.
-
А интересно - как вы обеспечиваете безопасность модификации этих регистров если они у вас модифицируются в порядке чтение-модификация-запись и отключение питания прервёт эту последовательность? Или это у вас просто набор незавимисмых друг от друга флагов?