Jump to content

    

EmDMAl

Участник
  • Content Count

    7
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. Отображение меню на жк

    Разобрался с меню. Но при размещении большого количества структур забилась вся оперативная память. И встал вопрос о размещении структур в флешь памяти. CODE... //Структура описывает пункт меню typedef struct _selection { unsigned char *mas; // Указатель на название пункта void (*function)(void); //Указатель на функцию выполняющуюся по нажатии на enter/escape unsigned ent_f: 4; //Флаг входа 4 бита - обычно ID меню в которое надо войти unsigned esc_f: 4; //Флаг выхода 4 бита - обычно ID меню в которое надо вернуться }SELECTION; //Структура описывает меню/подменю typedef struct _menu { unsigned char id; //Номер меню/подменю unsigned char num_selections; //Количество пунктов данного меню/подменю SELECTION *m; //Указатель намассив пунктов данного меню/подменю }MENU; ... //Массив хранищий пункты главного меню (структура SELECTION) static SELECTION menu_[]={ {X1, goto_menu, DELAY_MENU, MAIN_MENU}, //Punkt 1 {X12, goto_menu, FOCUS_MENU, MAIN_MENU}, //Punkt 2 {X16, goto_menu, QUANTITY_MENU, MAIN_MENU}, //Punkt 3 {X24, goto_menu, TIME_MENU, MAIN_MENU}, //Punkt 4 {X32, func7, 0, 0} //Punkt 4 }; //Массив хранищий пункты меню настроек (структура SELECTION) static SELECTION menu_m0[]={ {X2, func6, 0, 0}, //Punkt 1 {X3, func6, 0, 0}, //Punkt 2 {X4, func6, 0, 0}, //Punkt 3 {X5, func6, 0, 0}, //Punkt 2 {X6, func6, 0, 0}, //Punkt 2 {X7, func6, 0, 0}, //Punkt 2 {X8, func6, 0, 0}, //Punkt 2 {X9, func6, 0, 0}, //Punkt 2 {X10, func6, 0, 0}, //Punkt 2 {X11, func6, 0, 0} //Punkt 2 }; ... Так вот, кто-нибудь размещал эти структуры во флешь памяти?
  2. Обучение FreeRTOS

    При повторной установки новой версии ошибки с поиском библиотек исчезли. Теперь при компиляции выдает ошибку: КодError! E2028: vTaskStartTrace_ is an undefined reference Error! E2028: ulTaskEndTrace_ is an undefined reference. vTaskStartTrace - ф-ия трассировки данных и записи их в лог, при ее отключении exe компилируется, но ничего не отображается(dos-ий экран черный). Эта ф-ия используется в main.c и инициализируется в task.h, оба файла присоеденены к проекту. В FreeRTOSConfig.h configUSE_TRACE_FACILITY=1, правда #define configQUEUE_REGISTRY_SIZE=0, но менял значение для тестирования. TaskEndTrace - останавливает трассировку. Error! E2028: означает неопределенное значение, такое ощущение что компилятор не видит объявление этой ф-ии. Куда двигаться я не знаю, в инете подобной проблемы ни у кого нету.
  3. Обучение FreeRTOS

    Цитата(EmDMAl @ May 17 2012, 11:40) 1. Кто-нибудь, устанавливал компилятор Open Watcom используемый у Курницы? Все установлено по инструкции: Open Watcom в корень диска С, папка FreeRtos тоже в корень С. При компиляции целая куча ошибок разного рода. В принципе можно проекты под AVR Studio переделывать. 2. При попытки переделки под AVR Studio, возникает ошибки: КодD:\library\Pinboard\temp_Ci\FreeRTOSV7.1.1\Project\AVR_ATMega32_KURN_2\./FreeRTOSConfig.h:88:9: error: macro names must be identifiers #error Missing definition:  INCLUDE_vTaskDelay should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details. Не подскажите кто разбирал его примеры, как вы справлялись с переделками или подскажите хороший источник для обучения FreeRtos.
  4. Обучение FreeRTOS

    1. Кто-нибудь, устанавливал компилятор Open Watcom используемый у Курницы? Все установлено по инструкции: Open Watcom в корень диска С, папка FreeRtos тоже в корень С. При компиляции целая куча ошибок разного рода. В принципе можно проекты под AVR Studio переделывать. 2. При попытки переделки под AVR Studio, возникает ошибки: КодD:\library\Pinboard\temp_Ci\FreeRTOSV7.1.1\Project\AVR_ATMega32_KURN_2\./FreeRTOSConfig.h:88:9: error: macro names must be identifiers D:\library\Pinboard\temp_Ci\FreeRTOSV7.1.1\Project\AVR_ATMega32_KURN_2\..\..\Source\include/FreeRTOS.h:137:3: error: #error Missing definition: INCLUDE_vTaskDelay should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the ../AVR_ATMega32_KURN_2.c:22:10: error: 'string' undeclared (first use in this function) ../AVR_ATMega32_KURN_2.c:24:25: error: 'gt' undeclared (first use in this function) Не подскажите кто разбирал его примеры, как вы справлялись с переделками или подскажите хороший источник для обучения FreeRtos.
  5. Обучение FreeRTOS

    Цитата(EmDMAl @ May 15 2012, 09:03) Написал 2 письма автору, но ответа нету, да теперь и не нужно, оказывается код работает правильно. Пришел ответ от автора, может кому-нибудь пригодится на заметку, на будующее: В этой программе происходит доступ к разделяемому ресурсу PORTC без использования механизма взаимного исключения. Скорее всего ваша программа не работает именно из-за этого. Попробуйте один из следующих вариантов: 1. Увеличить задержку в циклах на несколько порядков: Кодfor( ul = 0; ul < 80000L; ul++ ) for( uq = 0; uq < 40000L; uq++ ) 2. Использовать критическую секцию для организации взаимного исключения: КодtaskENTER_CRITICAL(); PORTC ^= (1 << PC0); taskEXIT_CRITICAL(); ... taskENTER_CRITICAL(); PORTC ^= (1 << PC1); taskEXIT_CRITICAL();
  6. Обучение FreeRTOS

    1. Оказывется в Proteus 7.7. sp3 этот код работает некорректно, на железе все работает на ура. Значит очередной баг в Proteus. Просто тестирую я программы в нем. Цитата(iosifk @ May 13 2012, 21:48) А в статье для того и указан адрес автора, чтобы к нему любой читатель смог обратиться. К Курницу для начала обратитесь, так проще будет... Удачи! Написал 2 письма автору, но ответа нету, да теперь и не нужно, оказывается код работает правильно. 2. Цитата(Cosmojam @ May 13 2012, 23:08) hex - это текстовый файл где каждый байт данных занимает 2 символа + адреса, тип записи и сумма. Он по определению больше чем прошивка займёт флеши. Смотреть надо на размер бинарного файла или вывод линкера (гуру по вашему тулчейну подскажут как это сделать) Как я понял при компиляции в AVR Studio выдает Program: X bytes (Y% Full). Х это и есть размер чистого бинарного файла, который преобразуется в hex. Только вот вопрос: в конроллере hex займет flash память или бинарный? В makefile лесть не стал для запроса bin файла. 3. Цитата(juvf @ May 15 2012, 06:48) ... по ресурсам мне больше нравиться uOS, но возможно придётся повозиться с её освоением. uOS - довольно толковая документация, все разжевано. Но работаю я на компе ,6Гц, а там мин 2Гц, неизвестно будет нормально работать. И еще не подскажите как ее прикрутить к AVR Studio? В инете данный вопрос я не нашел.
  7. Обучение FreeRTOS

    Здравствуйте. Выбрал FreeRTOS для программирования МК AVR(в основном Atmega8,16,32..). В качестве рабочей среды использую AVR Studio 4.19 + AVR-TOOLCHAIN-3.3.0.710, а для обучения взял "FreeRTOS — операционная система для микроконтроллеров" Андрея Курница. И у меня естнственно возникают вопросы. 1. В первом примере (мигание 2мя светодиодами) используется задержка в задачах следующего типа: Кодfor( ul = 0; ul < 4000L; ul++ ) {}. Но с этой формой задержки у меня работает только одна задача, та которая первая вызывается в главном теле (Кодshort main( void ) {....}). Если использую одну из ф-ий задержек/сна vTaskDelay("Тик"), то работают обе ф-ии на ура. Так вот вообще такая запись как у Курница допускается или автор ее привел просто для понятия, но она никогда не будет работать? Ниже привожу код main.c и FreeRTOSConfig.h. 2. При компиляции этого кода у меня получился hex размером 11кб, на мой взгляд много. Делал все строго по инструкции автора, удалил все ненужное. Автор пишет, что размер ядра составляет 4-9кб, но это пик при использовании всех ф-ии. Так вот, почему же у меня при использовании 2х простых задач получилось уже 11кб? Можно ли как-нибудь программно отключить ненужные файлы. 3. Рассматривать FreeRTOS стал из-за ее популяризации(довольно много находил статей по ней). Может более опытные подскажут какая ОС более оптимальна в соотношении размера hex файла, возможностей и доступности документации? Пишу сюда, потому, что в инете это единственное место на мой взгляд где можно получить ответы по FreeRTOS. Помгоите разобраться. С уважением Дмитрий. main.c Код#include "FreeRTOS.h" #include "task.h" void vTask1( void *pvParameters ) {   volatile unsigned long ul;   for(;; )   {     PORTC ^= (1 << PC0);     for( ul = 0; ul < 4000L; ul++ )    {    }   }   vTaskDelete( NULL ); } void vTask2( void *pvParameters ) {   volatile unsigned long ul;   for(;; )   {     PORTC ^= (1 << PC1);     for( ul = 0; ul < 8000L; ul++ )    {    }   }   vTaskDelete( NULL ); } /*-----------------------------------------------------------*/ int main( void ) {   DDRC |= (1 << DDC0) | (1 << DDC1);   xTaskCreate( vTask1,  (signed char *) "Task1",  configMINIMAL_STACK_SIZE,   NULL,  1,   NULL );   xTaskCreate( vTask2,  (signed char *) "Task2",  configMINIMAL_STACK_SIZE,  NULL, 1,   NULL );   vTaskStartScheduler();   return 0; } FreeRTOSConfig.h Код#ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H #include <avr/io.h> #define configUSE_PREEMPTION        1 #define configUSE_IDLE_HOOK        0//Отключаю vApplicationIdleHook() #define configUSE_TICK_HOOK        0 #define configCPU_CLOCK_HZ        ( ( unsigned long ) 8000000 ) #define configTICK_RATE_HZ        ( ( portTickType ) 1000 ) #define configMAX_PRIORITIES        ( ( unsigned portBASE_TYPE ) 4 ) #define configMINIMAL_STACK_SIZE    ( ( unsigned short ) 85 ) #define configTOTAL_HEAP_SIZE        ( (size_t ) ( 1500 ) ) #define configMAX_TASK_NAME_LEN    ( 8 ) #define configUSE_TRACE_FACILITY    0 #define configUSE_16_BIT_TICKS    1 #define configIDLE_SHOULD_YIELD    1 #define configQUEUE_REGISTRY_SIZE     0 /* Co-routine definitions. */ #define configUSE_CO_ROUTINES         1 #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) /* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */ #define INCLUDE_vTaskPrioritySet        0 #define INCLUDE_uxTaskPriorityGet        0 #define INCLUDE_vTaskDelete            1 #define INCLUDE_vTaskCleanUpResources    0 #define INCLUDE_vTaskSuspend            0 #define INCLUDE_vTaskDelayUntil        1 #define INCLUDE_vTaskDelay            1 #endif /* FREERTOS_CONFIG_H */