dxp 65 1 февраля, 2006 Опубликовано 1 февраля, 2006 · Жалоба В документе"EE197 Multi-cycle Instructions and Latencies.pdf" присутствует интересная инфа про такты ожидания конвейера. Почему-то не удалось найти эти данные в основных документах - Hardware Reference Manual, Programming Reference Manual, Instruction Set Reference. Откуда товарисч, который автор этого EE197, взял информацию. Инфа, кстати, верная - проверил - и на симуляторе, и в железе все так и есть. Например, в упомянутом ЕЕ сказано, что (if LC0 > 1) - LC0/LC1 reg written to (например, LC0 = R0) или - LT0/LB0 written to and LC0 != 0 (например, LT0 = [sP++]) то на следующей команде возникнет stall аж в 9 тактов! И ведь это весьма значимая информация. Почему ее в основных документах не найти? Или плохо искал? Ткните тогда носом, плиз? :) И еще. Указанные нюансы встают в полный рост, когда происходит переключение контекста в RTOS, например. Т.е. там при восстановлении контекста (при активизации задачи/треда) происходит запись в эти регистры LCx/LTx/LBx, что неминуемо должно приводить неслабому увеличению времени выполнения. Учитывая, что контекст у черного фина сам по себе немаленький - порядка 180 байт или 44 32-битных слова, то время переключения делается тоже заметным. Даже если по одному такту на слово, то 44+44=88 тактов только на то, чтобы пихнуть контекст текущего процесса в стек и вытолкнуть контекст следующего из стека. А упомянутые stall'ы еще добавляют порядка 20-80 тактов. Да еще надо между метаниями контекстов переключить указатели стеков, сохранить/восстановить статус прерываний, это еще порядка двух десятков тактов. Т.е. при самом лучшем раскладе получается 88+20+20=128 тактов. Но вот попался рекламный проспект про ThreadX, где сказано, что Context Switch равен 105 тактов! Это как? Как такое возможно, если в лучшем случае выходит 128 тактов? Или там не все регистры сохраняют? Но тогда это не должно работать по определению. Или это просто какое-то рекламное лукавство? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdsp 0 6 февраля, 2006 Опубликовано 6 февраля, 2006 · Жалоба Решение очень простое. В EE197 прямо об этом и сказано, нужно обнулить lcX (или убедиться что там ноль). r0 = 0; lc0 = r0; lc1 = r0; Дальше можно загружать lcX без всяких задержек чем угодно. Предварительно, разумеется lc0,lc1 сохраняются в удобном месте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 7 февраля, 2006 Опубликовано 7 февраля, 2006 · Жалоба Решение очень простое. В EE197 прямо об этом и сказано, нужно обнулить lcX (или убедиться что там ноль). r0 = 0; lc0 = r0; lc1 = r0; Дальше можно загружать lcX без всяких задержек чем угодно. Предварительно, разумеется lc0,lc1 сохраняются в удобном месте. Это я все видел. Только тут тоже есть вопросы. Например, при записи в LCx даже 0 все равно уходит 10 тактов на каждый. И независимо от того, какое там записано значение. Т.ч. 20 тактов как с куста. :( И все же, где в доке (кроме этого ЕЕ) описаны все эти такты? Облазил HRM, PRM вдоль и поперек. Не нашел. Смутно помню, что вроде где-то попадалось, но вспомнить, хоть убей, не могу. Должно же где-то это быть! :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться