Jump to content

    

KolyanV

Свой
  • Content Count

    90
  • Joined

  • Last visited

Community Reputation

0 Обычный

About KolyanV

  • Rank
    Частый гость

Контакты

  • ICQ
    Array
  1. Смотрите описание функции API uxTaskGetStackHighWaterMark()
  2. Ничего не скажу по архитектуре блекфина, но приведенный Вами фрагмент мало о чем говорит. Насколько атомарна выполняемая там операция зависит от того, как компилятор его переведет в машиный код. В случае, приведенном топикстартером модификация ячейки памяти выполняется одной командой (add Count,eax) и поэтому она атомарна (во всяком случае в архитектуре x86). 2 xenia: Никаких cli / sci в коде прикладных программ под ОС высокого уровня Windows/Linux быть не может, и это правильно - времена ДОСов прошли.
  3. Команды процессора с точки зрения прерываний - атомарны. Т.е начатая команда обязательно будет выполнена до конца. Правда с учетом конвеерной обработки, не все так гладко. Возможно, завершение выполнения команды будет происходить тогда, когда процессор начнет вход в прерывание. Но, я думаю, это не должно волновать, так как завершение будет занимать доли/единицы тактов.
  4. Как Вы правильно заметили, при использовании RAW API вам прийдется самостоятельно заботиться о защите структур даных стека в условиях многопоточной среды. Т.е RAW API малопригодна при использовании в FreeRTOS. Зато Netconn API - прослойка специально созданная для многозадачной среды. Используйте Netconn API - обойдете большинство граблей.
  5. Согласно MSDN - действительно 4. Но на практике, под ОС Windows XP - часто приходилось сталкиваться с ограничением именно 2 Гб, х.з почему.
  6. Можете глянуть еще тут: http://electronix.ru/forum/index.php?showtopic=43180 Устройство для воспроизведения звука: 4 канала - 48 кГц, 8 каналов - 12 кГц. Работа с MMC без FAT
  7. Скорее всего у Вас на диске файловая система FAT32. Она не поддерживает файлы размером больше 2 Гб. Необходимо чтобы Ваш админ сконвертировал раздел диска командой: convert C: /FS:NTFS , где C: - том, который необходимо сконвертировать в файловую систему NTFS
  8. Пока без коментариев, нет времени. Позднее, если будет необходимо, могу прокоментировать. Фрагмент FreeRTOS_stats.h #if FREERTOS_TASK_STATS #define traceTASK_INCREMENT_TICK(xTickCount) TraceIncrementTick(xTickCount) #define traceTASK_SWITCHED_OUT() TraceSwitchedOut(pxCurrentTCB->uxTCBNumber, pxCurrentTCB) #define traceTASK_SWITCHED_IN() TraceSwitchedIn(pxCurrentTCB->uxTCBNumber) #define traceTASK_DELETE(xTCB) TraceTaskDelete(xTCB); // Максимальное количество задач, для которых ведется статистика #define MAX_TASK_STATS 15 // Период времени в тиках, на протяжении которого производится подсчет интервальной статистики #define TIME_COUNTING_INTERVAL 1000 // Количество тиков PIT таймера на одно переполнение PIT таймера (т.е. на один тик системного таймера) #define PIT_COUNTER_PERIOD (( ( ( configCPU_CLOCK_HZ / 16 ) / 1000UL ) * (1000 / configTICK_RATE_HZ) ) + 1) // ------------------------------------------------------------------------------ // Статистика активности задачи struct STFRTaskStat { unsigned RunningST; // Время работы задачи от момента старта (в системных тиках) unsigned RunningPT; // Параметр уточняющий RunningST, значение в тиках PIT таймера (частота MCK/16) unsigned Switches; // Количество переключений задачи от момента старта unsigned STLastInterval; // Время работы задачи на предыдущем интервале измерения (в системных тиках) unsigned PTLastInterval; // Параметр уточняющий STLastInterval, значение в тиках PIT таймера unsigned SwitchesLastInterval; // Количество переключений задачи на предыдущем интервале времени unsigned STCounter; // Время работы задачи от момента tasks_start_intervalST (в системных тиках) unsigned PTCounter; // Параметр уточняющий STCounter, значение в тиках PIT таймера unsigned SwitchesCounter; // Количество переключений задачи от момента StartTickCount unsigned TaskEnterST; // Момент времени входа в задачу (в системных тиках) unsigned TaskEnterPT; // Параметр уточняющий TaskEnterST, значение в тиках PIT таймера char pcTaskName[ configMAX_TASK_NAME_LEN ]; // Имя задачи void *xTask; // Дискриптор задачи unsigned InitFlag; // Флаг инициализации структуры ос статистикаой }; #endif /* FREERTOS_TASK_STATS */ #if FREERTOS_STATS // ------------------------------------------------------------------------------ // Структура описания статистики struct STFRStat { #if FREERTOS_TASK_STATS struct STFRTaskStat tasks[MAX_TASK_STATS]; // Статистика задач unsigned tasks_start_intervalST; // Момент начала интервала измерения (используется для вычисления STLastInterval) #endif }; extern struct STFRStat FreeRTOS_stats; #endif /* FREERTOS_STATS */ Фрагемент FreeRTOS_stats.c // ver 1.02 (16.11.2008) // Модуль предназначен для сбора, хранения и управления статистикой работы FreeRTOS // и пользовательских задач в его окружении // Также, модуль может выполнять контроль за переполнение стека задач /* Library includes. */ #include <string.h> #include <stdbool.h> /* Hardware specific headers. */ #include "Board.h" #include "AT91SAM7X256.h" /* Scheduler includes. */ #include "FreeRTOS.h" #include "task.h" #include "FreeRTOSConfig.h" // Статистика FreeRTOS #if FREERTOS_STATS struct STFRStat FreeRTOS_stats; #endif // Счетчик тиков таймера unsigned CurrentTickCount; #if FREERTOS_TASK_STATS // ------------------------------------------------------------------------------ // Функция вызывается системой FreeRTOS после обработки системного тика inline void TraceIncrementTick(portTickType TickCount) { CurrentTickCount=TickCount; } // ------------------------------------------------------------------------------ // Функция вызывается системой FreeRTOS перед сменой планировщиком текущей задачи. // Входные параметры: // TaskNumber - номер задачи, которая прервана планировщиком // hTask - дискриптор задачи (которая прервана планировщиком) void TraceSwitchedOut(portBASE_TYPE TaskNumber, xTaskHandle xTask) { static unsigned PTPos; static unsigned PTOv; static long PTCount; static struct STFRTaskStat *TaskStat; if (TaskNumber< MAX_TASK_STATS) { // Запоминаем значение счетчика PIT таймера - параметра определяющего точное значение текущего времени PTPos=AT91C_BASE_PITC->PITC_PIIR; PTOv= (PTPos & AT91C_PITC_PICNT) >> 20; PTPos &= AT91C_PITC_CPIV; // Выделяем адрес структуры статистики текущей задачи (для увеличесния скорости доступа) TaskStat= &FreeRTOS_stats.tasks[TaskNumber]; // Увеличесние счетчиков количества переключений задачи TaskStat->Switches++; TaskStat->SwitchesCounter++; // Если код выполняется впервые - инициализируем if (CurrentTickCount - TaskStat->TaskEnterST > 10) { TaskStat->TaskEnterST=CurrentTickCount; TaskStat->TaskEnterPT=PTPos; } // Определение точного времени выполнения задачи PTCount = (CurrentTickCount - TaskStat->TaskEnterST + PTOv) * PIT_COUNTER_PERIOD + (PTPos - TaskStat->TaskEnterPT); if (PTCount < 0) PTCount+=PIT_COUNTER_PERIOD; // Увеличение счетчиков времени выполнения задачи TaskStat->PTCounter+=PTCount; while (TaskStat->PTCounter >= PIT_COUNTER_PERIOD) { TaskStat->STCounter++; TaskStat->PTCounter -= PIT_COUNTER_PERIOD; } // Если задача вытесняется впервые - выполняем копирования имени задачи if (TaskStat->InitFlag==false) { TaskStat->xTask=xTask; TaskStat->InitFlag=true; memcpy(TaskStat->pcTaskName, (char *)((unsigned)xTask+52),16); } // Если необходимо - подсчитываем параметры времени выполнения задач за предыдущий интервал (если он завершен) if (CurrentTickCount - FreeRTOS_stats.tasks_start_intervalST >= TIME_COUNTING_INTERVAL) { for (int i=0;i < MAX_TASK_STATS; i++) { TaskStat=&FreeRTOS_stats.tasks[i]; // Увеличение счетчика времени выполнения задачи TaskStat->RunningST += TaskStat->STCounter; TaskStat->RunningPT += TaskStat->PTCounter; while (TaskStat->RunningPT >= PIT_COUNTER_PERIOD) { TaskStat->RunningST++; TaskStat->RunningPT -= PIT_COUNTER_PERIOD; } // Обновление данных о активности задачи за предыдущий интервал времени TaskStat->STLastInterval = TaskStat->STCounter; TaskStat->PTLastInterval = TaskStat->PTCounter; TaskStat->SwitchesLastInterval = TaskStat->SwitchesCounter; // Очистка текущих счетчиков TaskStat->STCounter=0; TaskStat->PTCounter=0; TaskStat->SwitchesCounter=0; } // Стартовая метка времени начинающегося интервала FreeRTOS_stats.tasks_start_intervalST=CurrentTickCount; } } } // ------------------------------------------------------------------------------ // Функция вызывается системой FreeRTOS после выбора планировщиком новой текущей задачи. // Входные параметры: // TaskNumber - номер задачи, которая сейчас будет запущена планировщиком void TraceSwitchedIn(portBASE_TYPE TaskNumber) { if (TaskNumber< MAX_TASK_STATS) { FreeRTOS_stats.tasks[TaskNumber].TaskEnterST = CurrentTickCount; FreeRTOS_stats.tasks[TaskNumber].TaskEnterPT = (AT91C_BASE_PITC->PITC_PIIR) & AT91C_PITC_CPIV; } } // ------------------------------------------------------------------------------ // Функция вызывается системой при удалении задачи // Входные параметры: // xTCB - дискриптор удаляемой задачи void TraceTaskDelete(xTaskHandle xTCB) { for (int i=0; i < MAX_TASK_STATS; i++) if (FreeRTOS_stats.tasks[i].xTask==xTCB) { FreeRTOS_stats.tasks[i].xTask=NULL; break; } } #endif /* FREERTOS_TASK_STATS */
  9. Trace Hook Macros

    Я сделал просто: Создал модуль FreeRTOS_stats.с, в котором находится функциональная часть, а в FreeRTOS_stats.h - дефайны, в FreeRTOSConfig.h добален инклуд файла FreeRTOS_stats.h Собственно, все.
  10. NT 4.0 будет проблематично установить на новом железе. Был подобный опыт. Проще сменить HDD.
  11. Не знаю как LPC2378, но AT91SAM7X256 отлично "кушал" TDM поток 48kHz/32бит на 8 каналов. Вопрос в том, что Вы дальше будете делать с этими данными ...
  12. Подтверждаю актуальность своей заявки, оставленной на 7-8 странице треда Хочу преобрести :)
  13. 1. Увеличьте значение параметра MEM_SIZE. Если памяти у вас мегабайты, можно ставить 64-256 КБайт 2. Увеличьте значение TCP_SND_BUF. В случае достаточности памяти - 64 Кбайт 3. Также имеют значения размеры буферов драйвера. У меня на SAM7X256: MEM_SIZE =24000 TCP_SND_BUF=4500 FreeRTOS v5.0.3 + LwIP v1.3 на TCP достигает скорости 6,5 МбИт/сек, это, правда, при "холостой" отправке. В задаче с реальными данными - 4 Мбит/сек, предел с реальными данными (для моей задачи) - ок. 5 МБит/сек Да, и еще важный момент: Если используете NETCONN, обязательно устанавливайте опцию TCP_NODELAY для TCP. Собственно, при использовании сокетов это тоже нужно
  14. Есть еще такое: http://electronix.ru/forum/index.php?showtopic=43180&hl=
  15. Извиняюсь, что долго не отписывал, обо всем по порядку: Да, бит влево сдвигаю, интерфейс настроил в точности с описанием цирусовского TDM в даташите. Об этом подробнее - далее VA И VX - одно напряжение. Осцилографом проверял, пульсации есть. Если верить моему китайскому осцилографу PDS-5022, амплитуда ВЧ шумов около 200 мВ. Судя по всему, проблема не в питании, об этом ниже. Прием данных осуществляется в slave режиме (АЦП выступает мастером), для приема используется PDC с двумя буферами. В прерывании осуществляется "подсовывание"контроллеру PDC следующего буфера и отправка сообщения обрабатывающей зааче. По данному сообщению отдельная задача приложения "потрошит" буфер c принятыми данными, перекладывает его в другой буфер и готовит на отправку в компьютер. Так вот, подстановка табличного синуса осуществлял не в прерывании, а в задаче, которая "потрошит". В этом случае переданный в компьютер звуковой тракт с табличным синусом был без искажений. На текущий момент я выяснил, что причниой искажений сигнала стало не соответствие формата интерфейса передачи CS5368 и приема в контроллер. Интерфейс я запрограммировал строго согласно даташита. Как оказалось даташит соврал в одном - в полярности тактового сигнала, т.е контроллер был запрограммирован на декодирование данных по фронту такта, а должен декодировать по спаду. И, чесно говоря, не было и в мыслях проверять корректность описания в даташите. Да, кроме того, при определении причины, меня сбило с правильного пути еще одно обстоятельство. После правильной настройки интерфейса, в тракте все еще оставались щелчки, только сейчас я их детально проанализировал, оказалось их период кратен размеру буфера. С этим я еще буду разбираться, может на какой пункт errata наткнулся... По результатам отпишусь. Всем спасибо за внимание и советы!