20.06.2015, 23:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Пишем свое API
Сообщение от Easyrider83
|
Продолжение следует...
|
ну что там с продолжением? )))
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
21.06.2015, 01:04
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Пишем свое API
Отпуск кончился, теперь трудовыебудни )) не успеваю. А чего теперь писать будем? Progress bar? Окно с элементами управления?
|
|
|
|
21.06.2015, 01:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,538
Сказал спасибо: 698
Сказали Спасибо 4,313 раз(а) в 1,977 сообщении(ях)
|
Re: Пишем свое API
Сообщение от Easyrider83
|
трудовыебудни
|
Звучит задорно и многообещающе, надо взять на вооружение. А без трудо ваще зловеще. Похоже на специфику работы некоторых дам. Новый вклад в народное творчество.
Поразмыслим на выеходных.
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
Последний раз редактировалось Kabron; 21.06.2015 в 01:18.
|
|
|
|
21.06.2015, 19:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Пишем свое API
Сообщение от Easyrider83
|
Progress bar? Окно с элементами управления?
|
думаю окошко более полезно?
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
20.08.2015, 00:11
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Пишем свое API
Итак, я решил продолжить. С новыми элементами API пока притормозим, но не много времени уделим FreeRTOS. Зачем нам операционка, скажете вы? Дело в том, что те задачи, которые раньше требовали от нас кучу терпения и ресурсов теперь делается легко и быстро. Простой пример - вывод информации на дисплей. Дело в том, что доступ к дисплею может иметь несколько процессов. И каждый из них должен как-то легко и просто выбросить информацию на дисплей и не дожидаясь, пока она будет отрисована, завершиться. Как сделать одновременный доступ к ресурсам без применения RTOS? Можно, конечно, через кольцевой или двойной буфер, но это груда кода. А здесь - пара строчек.
Итак, мы будем выводить текст. Для этого нам понадобится некая элементарная структура. Позже мы будем передавать сам элемент API, а пока ограничимся элементарной структурой.
Код:
|
typedef struct
{
u16 XStart; //начальные координаты по х и у
u16 YStart;
u16 Color; //цвет текста
u16 BackColor; //цвет фона
char Text[20]; //сам текст, не более 20 символов
}LCD_DataTypeDef; |
И локально задекларируем очередь:
Код:
|
QueueHandle_t LCD_Queue; |
Инитиализируем контроллер и таски:
Код:
|
int main ()
{
stm32_Init();
xTaskCreate( vInitTask, "InitTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 5 , NULL);
xTaskCreate( vLEDTask, "LED Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 3 , NULL);
vTaskStartScheduler();
return 0;
} |
Собственно, сам таск, который инитиазирует переферию и, чтобы принести еще не много пользы, будет выбрасывать информацию на дисплей.
Код:
|
void vInitTask(void * pvArg)
{
LCD_Initializtion();
LCD_BackLight_Init();
LCD_Clear(Blue);
LCD_Queue = xQueueCreate(10, sizeof(struct LCD_DataTypeDef *) + 20);
xTaskCreate( vLCD_HandleThread, "LCD Thread", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1 , NULL);
//vTaskDelete( NULL ); // этой командой мы убиваем таск и освобождаем память
while(1)
{
static LCD_DataTypeDef LCD_Data = {120, 0, Green, Black, "BYE WORLD"};
if (LCD_Queue) xQueueSend(LCD_Queue, &LCD_Data, 0);
if (LCD_Data.YStart ‹ 300) LCD_Data.YStart += 16;
vTaskDelay(630);
}
} |
А этим таском будем мигать диодом и тоже выбрасывать информацию на дисплей:
Код:
|
void vLEDTask(void * pvArg)
{
while(1)
{
static LCD_DataTypeDef LCD_Data = {0, 0, Red, Black, "HALLO WORLD"};
if (LCD_Queue) xQueueSend(LCD_Queue, &LCD_Data, 0);
if (LCD_Data.YStart ‹ 300) LCD_Data.YStart += 16;
vTaskDelay(520);
PIN_INV(PB0);
}
} |
Как легко догадаться, командой xQueueSend мы заполняем очередь новыми элементами. Ну и собственно сборщик информации из очереди:
Код:
|
void vLCD_HandleThread (void * pvArg)
{
LCD_DataTypeDef LCD_Data;
while(1)
{
xQueueReceive(LCD_Queue, &LCD_Data, 0);
GUI_Text(LCD_Data.XStart, LCD_Data.YStart, LCD_Data.Text, LCD_Data.Color, LCD_Data.BackColor);
vTaskDelay(10);
}
} |
Вопросы сюда. Проект тут.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
20.08.2015, 00:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Пишем свое API
Сообщение от Easyrider83
|
GUI_Text(LCD_Data.XStart, LCD_Data.YStart, LCD_Data.Text, LCD_Data.Color, LCD_Data.BackColor);
|
Как-то не кошерно это;
Сделать GUI_Text(&LCD_Data) - это более по-взрослому;
|
|
|
|
20.08.2015, 01:02
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Пишем свое API
|
|
|
|
20.08.2015, 01:37
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Пишем свое API
Сообщение от Boba_spb
|
Вы ж молодежь учите !
А как-то кривовато все. Тут, например YStart - всегда будет равно 16. И будет ученик репу чесать, что эт текст по экрану не двигается? И будет думать, что чего эт текст в 0 позиции не был, а сразу на 16 да и там замер.
Будьте внимательнее - они и так плохо учатся сейчас, а Вы еще их к ошибкам приучаете.
|
Смотрите внимательнее. Переменная типа static. Текст движется.
Чего здесь реально не правильно сделано - это нет проверки готовности данных в очереди:
Код:
|
if (xQueueReceive(LCD_TextQueue, &LCD_TextData, 0) == pdTRUE)
GUI_Text(LCD_TextData.XStart, LCD_TextData.YStart, LCD_TextData.Text, LCD_TextData.Color, LCD_TextData.BackColor); |
Последний раз редактировалось Easyrider83; 20.08.2015 в 01:45.
|
|
|
|
20.08.2015, 02:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Пишем свое API
Ну да static - прошу пардона
Последний раз редактировалось Boba_spb; 20.08.2015 в 02:32.
|
|
|
|
21.08.2015, 14:17
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Пишем свое API
хм.... эта тема вообще кому-нибудь интересна?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
свое USB устройство
|
ESWANT |
Микроконтроллеры, АЦП, память и т.д |
2 |
08.09.2009 14:58 |
Часовой пояс GMT +4, время: 06:29.
|
|