реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> TNKernel & STM32
hound
сообщение Feb 15 2015, 20:48
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 15-02-15
Пользователь №: 85 179



Добрый вечер, начал работать с TNKernel использую версию 2.7.
Есть один вопрос:
нужно определенную функцию выполнять через некоторое время системных тиков, сейчас реализовал через задачи подобным образом:
Код
#define   REBOOT_START    0x00
#define   REBOOT_UP       0x01
#define   REBOOT_END      0x02

void func_reset(void *par) {
    uint8_t status = REBOOT_START;

  uart-send_string("Start activate modem");
  
  while (1) {
    switch(status_reboot) {
      case REBOOT_START:
        GPIOB->BSRR=GPIO_Pin_1;
        status = REBOOT_UP;
        tn_task_sleep(3000);
        break;
      case REBOOT_UP:
        GPIOB->BRR=GPIO_Pin_1;
        status = REBOOT_END;
        tn_task_sleep(1000);
        break;
      case REBOOT_END:
        send_cmd_device(POWER_UP);
        tn_task_exit(TN_EXIT_TASK);
        break;
    }
  }
}


Т.е. создаю задачу без ее запуска при создании, а потом уже в коде программы, там где нужно запустить/перезагрузить девайс я запускаю эту задачу
Код
tn_task_activate(&task_reset);


Но на сколько это оправданно?
Заранее благодарен за ответ.
Go to the top of the page
 
+Quote Post
LexsZero
сообщение Feb 16 2015, 13:03
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 21-04-11
Пользователь №: 64 536



Цитата(hound @ Feb 16 2015, 00:48) *
Но на сколько это оправданно?


Код совершенно бессмысленный, стейт-машина не нужна. Почему просто не сделать синхронную функцию и звать ее откуда надо? Все равно пока девайс резетится, вы с ним ничего полезного не сделаете.

Код
void reset_device(void) {
    uart-send_string("Start activate modem");

    GPIOB->BSRR = GPIO_Pin_1;
    tn_task_sleep(3000);
    GPIOB->BRR = GPIO_Pin_1;
    tn_task_sleep(1000);
    send_cmd_device(POWER_UP);
}


Гораздо проще же. А чтоб несколько потоков не подрались за девайс, обернуть все операции с ним в мютекс, а еще лучше сделать отдельный таск, который полностью будет заниматься управлением девайсом, а с внешним миром взаимодействовать через очереди или эвенты. Код писать уж не буду.
Go to the top of the page
 
+Quote Post
hound
сообщение Feb 21 2015, 16:15
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 15-02-15
Пользователь №: 85 179



Да, действительно очень и очень глупая ошибка...конечно же проще все делать в одном таске, чем городить новые.
Спасибо за разъяснение.

Но появился следующий вопрос. После того как мы подали на некоторое время сигнал на ножку девайса нам нужно его настроить и если он не отвечает то его снова перезагрузить подачей сигнала на ножку. Как я себе представляю данный код в таком случае:
Код
void task_device(void *par) {
  while (1) {
    dbg_send("Reboot device\r\n");
    GPIOB->BSRR=GPIO_Pin_1;
    tn_task_sleep(3000);
    GPIOB->BRR=GPIO_Pin_1;
    tn_task_sleep(2000);    
    
    if (check_device()          == ACTION_FAIL) continue;
    if (change_setting()        == ACTION_FAIL) continue;
    
    while (1) {
      rc = tn_queue_receive_polling(&queue_modem_send_data, (void **)&pos);
      if (rc == TERR_NO_ERR) {
        device_send_message();
      }
  
      if (check_device() == ACTION_FAIL) break;
  
      tn_task_sleep(1000);
    }
    
  }
}


Если девайс нам не отвечает на команды, то мы просто перезапускаем цикл.
А уже во внутреннем цикле идет дальнейшая работа с девайсом, проверяем есть ли сообщения в очереди, если нет, то проверяем не подвис ли девайс, если подвис, то выходит из внутреннего цикла, а во внешнем цикле все по новой - перезагрузка, настройка и т.п
И задача засыпает на 1000 тиков (в данном случае на 1 сек.) чтобы другие задачи могли выполняться.
Использовать очередь с блокировкой задачи не совсем вариант, т.к нам нужно время от времени проверять состояние устройства.
Или же можно реорганизовать работу данного таска?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 15:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01368 секунд с 7
ELECTRONIX ©2004-2016