~~NOTOC~~ ====== OSA : История изменений ====== **[[en:osa:ref:download:history|Поздние версии]]** ====Ранние версии ==== === 81206 === 26 ноября 2008 {{osa:history:osa_81126.zip|скачать}} @ 127 кБ * Исправлен баг, появившийся в версии 81126: при переопределении константы OS_DTIMER_SIZE проект отказывался собираться. * Исправлена ошибка в определении макроса OS_Dtimer_Get ---- === 81126 === 26 ноября 2008 {{osa:history:osa_81126.zip|скачать}} @ 127 кБ * Все сервисы динамических таймеров переименованы из OS_xxx**P**Timer в OS_xxx**D**Timer. Старые имена оставлены для совместимости ---- === 81025 === 25 октября 2008 {{osa:history:osa_81025.zip|скачать}} @ 64 кБ * Все комментарии в исходниках переведены на английский ---- === 81010 === 10 октября 2008 {{osa:history:osa_81010.zip|скачать}} @ 325 кБ * Переработаны статические таймеры. Они стали удобнее в обращении (см. [[osa:ref:services:timers#Статические таймеры|Статические таймеры]]). Следует обратить внимание на [[osa:ref:services:timers#Пример применения|пример применения]]. Старые статическе таймеры для совместимости оставлены без изменений. * Добавлена возможность включать отдельно статические таймеры, динамические таймеры и таймеры задач (раньше таймеры задач включались автоматически при использовании любого тапи таймеров) * Для каждого типа таймеров теперь можно задавать свою разряднось (раньше разрядность таймеров задач ---- === 81008 === 08 октября 2008 {{osa:history:osa_81008.zip|скачать}} @ 316 кБ * В _OS_CheckEvent для PICC18 не сбрасывался флаг bDelay (сбрасывался только во временной переменной OS_state). В результате этой ошибки задача после ожидания события с таймаутом уходила в задержку. ---- === 81007 === 7 октября 2008 {{osa:history:osa_1007.zip|скачать}} @ 317 кБ * Из файла OSA.c в отдельные файлы вынесены специфичные для каждого типа контроллеров функции (см. папку "port"). * Из файла OSA.h в отдельные файлы вынесены все сервисы (см. папку "services"). * Исправлен недостаток для MCC30: программа работала только при отключенной оптимизации. Теперь работает при любой, за исключением ключа -mpa (procedural abstraction) * В тип дескриптора задач для MCC30 добавлены 8 слов для сохранения регистров W8..W15 ---- === 80931 === 01 октября 2008 {{osa:history:osa_80931.zip|скачать}} @ 316 кБ * исправлена ошибка с переменной _OS_DTimer: она объявлялась в банке OS_BANK а работа с ней велась как с near ---- === 80930 === 30 сентября 2008 {{osa:history:osa_80930.zip|скачать}} @ 316 кБ * Исправлена ошибка в OS_Sched для неприоритетного режима: неправильно обрабатывалась ситуация с OS_IsInCriticalSection (вместо смены задачи блокировалось обнуление _OS_temp) * Исправлена ошибка в сервисе OS_IsSMsgFree: проверялось инверсное условие. * Для PICC18 была заблокирована метка _OS_SchedRetPointNoSave (используется в StopTask) * Для PICC12 была исправлена ошибка с удалением DTimer'а * Для PICC12 _OS_DTimer размещалась в банке bank0, а работа с ней велась как с OS_BANK. Если OS_BANK был ненулевым, то DTimer'ы работали некорректно * Для MCC18 исправлен сервис удаления динамического таймера (не сбрасывался бит NextEnable при удалении последнего таймера в списке) ---- === 80922 === 22 сентября 2008 {{osa:history:osa_80922.zip|скачать}} @ 316 кБ * Добавлен порт под 12-разрядные ПИКи. * Возвращен неприоритетный режим (причина: сильно экономит ROM и RAM для 12-разрядников). * Определение OS_ENABLE_ALL включает в себя теперь также OS_ENABLE_CRITICAL_SECTIONS и OS_ENABLE_INT_SERVICE * Новый сервис OS_Run() (определен как for(;;) OS_Sched()) ---- === 80916 === 16 сентября 2008 {{osa:history:osa_80916.zip|скачать}} @ 290 кБ * **Исправлен баг для PICC18**: если прерывание возникало в момент передачи планировщиком управления задаче (инструкция movff postdec0, pcl), то в стеке забивалась ячейка. ---- === 80915 === 15 сентября 2008 {{osa:history:osa_80915.zip|скачать}} @ 290 кБ * **Исправлен баг для MCC30**: при выполнении OS_Task_Replace приоритет новой задачи заменялся приоритетом удаляемой. * При вызове OS_Task_Create из тела задачи флаги состояния копировались в новую задачу. ---- === 80909 === 09 сентября 2008 {{osa:history:osa_80909.zip|скачать}} @ 290 кБ * **Добавлен порт под 16-разрядные пики (PIC24 и dsPIC)** * Убран неприоритетный режим * Убраны SLOW_TIMERS * Проведена оптимизация кода по ROM, RAM и скорости * Из документации убрано сравнение с другими RTOS * В документацию добавлена статистика по использованию памяти и по скорости. * Добавлена ссылка "Документация On-line". ---- === 80906 === 06 сентября 2008 {{osa:history:osa_80906.zip|скачать}} @ 238 кБ * Переделаны сервисы возврата для PICC16: заменены все конструкции, чтобы избавиться от директив DW ---- === 80905 === 05 сентября 2008 * **Исправлена ошибка для PICC16**: если дождались события до таймаута (сервисами OS_WaitXXXTimeout или OS_SendXXXTimeout), то после передачи управления планировщику в задачу возвращались только по истечению оставшегося времени таймаута. * В OS_InitDelay для FAST_TIMERS установка бита State.bDelay переставлена. Теперь она стоит за присвоением таймера, а не перед. Раньше это могло быть следствием записи неправильного значения в Timer. * Добавлено восстановление PCLATH перед возвратом в задачу из _OS_CLEAR_READY и _OS_CLEAR_READY_SET_CANCONTINUE ---- === 80904 === 04 сентября 2008 * **Исправлена ошибка для неприоритетного режима в PICC16**: пропускался сброс флага bCanContinue, из-за чего сервисы ожидания событий в некоторых случаях могли выходить из ожидания сразу же, не дожижаясь. ---- === 80902 === 02 сентября 2008 * **Исправлен баг: в MPLAB C18** в функции main() портились локальные переменные. Модель стека допускается только Single-bank (Меню Project/Build options/Project закладка MPLAB C18 категория Memory Model). ---- === 80827 === 27 августа 2008 * **Исправлен баг: в PICC16** при выполнении двух OS_Yield() подряд второй неправильно сохранял адрес возврата. ---- === 80826 === 26 августа 2008 * Переработан планировщик для неприоритетного режима. Раньше, если в задаче выполнялся сервис ожидания события, уже произошедшего на момент проверки, то управление планировщику не передавалось. Теперь передается, т.к. раньше могло получиться так, что если задача ожидает события, уже установленные на момент проверки, то остальные задачи никогда не получат управление. Т.е. нарушался порядок round-robin, при котором все готовые задачи должны выполняться по очереди. * **Исправлена ошибка**: если из задачи управление планировщику передавалось сервисом OS_Yield(), то задача могла получить управление первой, вне зависимости от приоритета. ---- === 80824 === 24 августа 2008 * **Исправлен баг**: в неприоритетном режиме при ожидании события, обозначенного указателем, в сервисах с таймаутом мог неправильно определяться флаг таймаута. ---- === 80823 === 23 августа 2008 * **Исправлена ошибка**: не была глобально объявлена метка OS_ClearReadySetCanContinue ---- === 80822 === 22 августа 2008 * **OSA портирована под Microchip C18** ---- === 80821 === 21 августа 2008 * **Исправлена ошибка**: сервис OS_RI() не восстанавливал бит GIEL при IPEN = 1 ---- === 80814 === 14 августа 2008 * **Исправлена ошибка** в описании макросов ожидания флагов (программа не компилировалась). ---- === 80811 === 11 августа 2008 * **Исправлена ошибка**, сделанная в 80810: DTimer'ы не удалялись сервисом OS_Dtimer_Delete. ---- === 80810 === 10 августа 2008 * Сделаны DTimer'ы - динамические таймеры (см. описание 1.3.5 и 2.12) ---- === 80808 === 08 августа 2008 * Немного сокращен и ускорен код. * Константа _ROM_PAGES для PIC16 определяется автоматически * Для PIC16 добавлена возможность размещать системные переменные в банках 2 и 3: - задачи (OS_BANK_TASKS) - двоичные семафоры (OS_BANK_BSEM) - таймеры пользователя (OS_BANK_TIEMRS, OS_BANK_TIMEOUTS, ...) (одной константой OS_BANK_OS по-прежнему можно задать банк для всех вышеперечисленных переменных) - флаги (банк задается индивидуально при описании переменной-флага) - сообщения (банк задается индивидуально) - короткие сообщения (банк задается индивидуально) * Нельзя размещать в банках 2 и 3: - счетные семафоры - очереди сообщений Следует обратить внимание, что все переменные OS_xxx_BANK переделаны в OS_BANK_xxx (см. мануал 3.4) ---- === 80805 === 05 августа 2008 * **Исправлена ошибка в диспетчере для PIC16**: неправильно сохранялись биты PR0 и RP1 при переключении контекста * **Исправлена ошибка** в сервисах ожидания сообщения из очереди с таймаутом: непраильно проверялся бит таймаута ---- === 80803 === 03 августа 2008 * **Исправлена ошибка** в инициализации. Для PIC18 при размещении дескрипторов задач (OS_TaskVars[]) в RAM выше адреса 0x100 задачи не обнулялись при запуске программы. ---- === 80603 === 03 июня 2008 * Немного подправлены макросы, описывающие сервисы работы с флагами. * По ошибке был удален сервис OS_Csem_Accept. Теперь он восстановлен. * **Исправлена ошибка** в функции _OS_SignalCSem. Она проявлялась в PICC18 при размере счетного семафора = 1: FSR устанавливался неправильно. Исправлено. ---- === 80529 === 29 мая 2008 Версия сыроватая. До конца я ее не тестировал, но попробовать поиграться с ней стоит. * Изменен порядок работы с таймерами задач. В результате этого удалось: - Снять ограничение, описанное в п.1.3.3 в файле OSA_manual.doc - сократить генерируемый код (на сколько - зависит от количества задач и разрядности таймера, но в среднем для 16-разрядного таймера экономится 40 слов); - освободить 4 байта RAM (для 16-разрядного таймера); - увеличить скорость выполнения: - инициализации таймера (в 2 раза: с 53 тактов до 25); - проверки таймера в планировщике (с 51 такта до 4 тактов). * Код для входа и выхода из критической секции теперь включается в программу, только если в файле OSAcfg.h определена константа: #define OS_ENABLE_CRITICAL_SECTION ---- === 80526 === 26 мая 2008 * Изменена OS_MAX_DELAY для типа OST_TIMER = unsigned int, выбираемое по умолчанию: 0xFF00 -> 0xF000. Тем самым увеличен допуск на максимальное время захвата процессора одной задачей (см. OSA_Manual 1.3.3). * Переделаны сервисы запрета/разрешения/восстановления прерываний. - Для pic18 убраны DIH, DIL, RIH и RIL (оставлены только DI и RI) - DI теперь возвращает char - предыдущее состояние GIE (GIEH, GIEL) - RI теперь требует параметр char - откуда восстанавливать GIE (GIEH, GIEL) Работа теперь выглядит так: char cTemp; ... cTemp = DI(); // Запрещаем прерывания, сохраняя предыдущее состояние GIEx в cTemp ... RI(cTemp); // Восстанавливаем прерывания из cTemp ... * Добавлена возможность работать со счетными семафорами и очередями сообщений в прерываниях: - В OSAcfg.h нужно определять константу: #define OS_INT_ENABLE - Для работы со счетными семафорами нужно использовать сервисы: OS_CheckCSemInt, OS_SetCSemInt, OS_SetCSemValueInt, OS_ResetCSemInt * Функция OS_Init была неправильно оптимизирована, в результате чего код не оптимизировался, если количество биарных семафоров или пользовательских таймеров превышало 88 (редкая ситуация, но все же...). ---- === 28.04.2008 === 28 апреля 2008 * Немного переработан обработчик OS_Timer. Раньше это был макрос, вставляемый непосредственно в код программы. Теперь, вследствие модификации кода для PIC18 (для сокращения применен ассемблер), это функция. Однако, оставлена возможность пользоваться им по-старому: для этого нужно в OSAcfg.h определить константу: #define OS_USE_INLINE_TIMER * Немного ускорена работа планировщика (где-то на 30%). В результате код для PIC16 будет короче, чем в предыдущих версиях OSA, а код для PIC18 будет длиннее. ---- === 18.04.2008 === 18 апреля 2008 * В результате некоторых модификаций по сокращению кода (после 1.04.2008) была допущена ошибка: при ожидании события без таймаута оно всегда считалось уже случившимся.