jacOS при работе с 24 битными указателями. Компилятор не совсем адекватно транслирует код. Может не все читают микрочип. Преодолеть проблему можно следующим образом.
В файле jacos.h в первой строке пишем #pragma psect text=taskOsMain добавляем опции линкера -L-PtaskOsMain=ADRESh, значение адреса должно быть выше середины доступной памяти.
Я указываю 1Е000, это зависит от размера main. Хотя есть прикол, если указать в качестве адреса последнюю доступную ячейку памяти, в моем случае 1FFFFh, то структура данных создается нужной, а размещает как компилеру удобнее, ну это так лирическое отступление.
Еще одно замечание, в одном проекте нельзя использовать задачи с тиками и без, это проблема преобразования типов, откорректировать можно, но мне сейчас неинтересно, и так почти три дня потерял.
Так же надо подправить jacos.h следующим образом
typedef OS_CVALIF struct OST_SEMAPHORE_ {
OST_TASK_P queue; //Размер 2 байта, при трех требуемых, оптимизатор перестарался
#ifdef POINTER_24
unsigned char tmp; //Дополнение до требуемого размера допустимо, поскольку вся работа ведется
//посредством указателей.
#endif
#ifndef OS_USE_PRIO
OST_TASK_P last;
#ifdef POINTER_24
unsigned char tmp1;
#endif
#endif
OST_SEM semaphore;
} OST_SEMAPHORE;
typedef OST_SEMAPHORE OS_VAR_LOC *OST_SEMAPHORE_P;
typedef OS_CVALIF struct OST_FLAGS_ {
OST_TASK_P queue;
#ifdef POINTER_24
unsigned char tmp;
#endif
#ifndef OS_USE_PRIO
OST_TASK_P last;
#ifdef POINTER_24
unsigned char tmp1;
#endif
#endif
OST_FLG flags;
} OST_FLAGS;
В jacnfg.h необходимо добавить определение #define POINTER_24
Нельзя сказать, что это ошибка компилятора, просто планировщик так написан.
Мне необходимы только флаги, и семафоры с таймаутами, это я и подправил. Для очередей надо сделать то же.