_artem_
Jul 18 2007, 23:47
вобшем кое что поправил для 128 порта и вроде бы односекундная мигалка работает. остальное буду на рабочем проекте тестировать.
Но один вопрос все таки гложет - с регистрами EIND для инструкций EICALL и EIJMP (новое в 1280) и старый RAMPZ .
С RAMPZ вроде бы ясно - пиши во флеш в одном месте и не забывай прерывания запрешать и все как будто ок будет, я даже его не использую .
с EIND немного темновато , прочесал код от моего проекта на наличие EICALL и EIJMP... ничего подобного не нашел. То ли их наличие зависит от размера кода то ли от версии компилятора ли? При смене контекста на другую задачу вполне возможно использование данной регистра в другой задаче тоже. Вопрос в том - пихать ли его тоже в стек или нет при смене контекста?
Если кто нибудь знает при каких условиях этот регистр применяется буду признателен за наводку.
_artem_
Jul 20 2007, 11:08
Ответ от атмеля :
The ATmega1280 or devices with less flash memory does not have the EIJMP instruction, which means that you do not need to store this value for these devices. This is shown in the notes in datasheet on page 423. However to be 100% compatible with the ATmega2560/2561 and devices with bigger flash memories you do need to store this register on the stack for these devices. This is because a ISR might interrupt between writing the address to Z and EIND registers and performing the actual jump. I do not know which current compilers use this instruction, but to be able to utilize the memory completely they will need to do so. So to be compatible I would save the EIND register, even if that gives you a higher memory footprint for your RTOS for these devices.
Спасибо за внимание