Просто IAR-примерчики для дальнейшего их развития. Ничего личного.
Блюстителям нравственноти - не читать :)
Применять только в стремных ситуациях.
Когда уже проект написан и отлажен, можно внести "рюшечки", затрудняющие дальнейшее развитие его без Вас.
// Переход программы на массив _flash-данных.
////////////////////////////////////////////
// Хаотически расположенные коды асм-функций, полезных,
// бесполезных, и откровенно вредных.
// Инициализация периферии, например...
// По дате компиляции вызываются правильно.
// Неправильная дата - улёт.
// А какая она, правильная, знает только афтор.
const unsigned int __farflash area_fun[] =
{
0x0000, // nop fun1
0x0000, // nop
0x9508, // ret
0x0000, // nop fun2
0x0000, // nop
0x9508, // ret
0x0000, // nop fun3
0x0000, // nop
0x9508, // ret
0x940c, // jmp 0x1234 fun4
0x091a,
0x9508 // ret
}; // и так дохера элементарных кодов, включая функции-ловушки.
unsigned int * ptrf = (unsigned int *)area_fun;
////////////////////
__C_task main( void )
{
((void (*)())(((unsigned int)((unsigned int *)area_fun) >> 1)))(); // Переход программы на массив _flash-данных.
// Переход в зависимости от даты компиляции!!!
{
unsigned char n = __DATE__[0];
n += __DATE__[1];
//......
n += __DATE__[5];//выёживаюсь,чтобы получить нужный индекс массива
n=6;//для определенности вызываю fun3
((void (*)())(((unsigned int)((unsigned int *)(area_fun+n)) >> 1)))();
n=3;//для определенности вызываю fun2
((void (*)())(((unsigned int)((unsigned int *)(area_fun+n)) >> 1)))();
n=9; // ловушечка fun4
((void (*)())(((unsigned int)((unsigned int *)(area_fun+n)) >> 1)))();
}
}//main