03.03.2022, 15:12
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Запуск отложенных программ
С названием темы заморочился...
И так, задача:
Есть удаленное устройство (радиоканал) и нужно на него передать до восьми команд, потом запустить их исполнение в цикле до получения следующего набора.
Команды могут быть в произвольном порядке, но не более восьми. Для исполнения каждой есть функция.
Как-то не приходилось сталкиваться с такими задачками, поэтому растерялся.
Для справки восемь команд - это 8!, более 40 тысяч комбинаций.
Форумчане, посоветуйте что-нибудь, либо ткните носом в известные (не мне) способы. Установку какой-либо OS на конечном устройстве не предлагать.
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
03.03.2022, 15:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.02.2005
Адрес: Минск, Беларусь
Сообщений: 7,780
Сказал спасибо: 2,671
Сказали Спасибо 2,645 раз(а) в 1,953 сообщении(ях)
|
Re: Запуск отложенных программ
Сообщение от marera
|
передать до восьми команд, потом запустить их
|
Добавьте 9-ю команду - GO (START).
Или - поле/признак запуска выполнения принятого набора.
Или - жестко задать прием строго 8 команд, добавить команду NOP в набор уже имеющихся.
|
|
|
|
03.03.2022, 16:05
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: Запуск отложенных программ
Сообщение от Yuri222
|
Добавьте 9-ю команду - GO (START).
Или - поле/признак запуска выполнения принятого набора.
Или - жестко задать прием строго 8 команд, добавить команду NOP в набор уже имеющихся.
|
Старт и стоп - понятно. И набор команд в разных видах принять можно. Вопрос в том, как с помощью этого набора обеспечить вызов последовательности соответствующих функций.
Мне видится вариант с размещением функций по заданным адресам и сопоставлением их командам. Правда я этого ни когда не пробовал и пока не представляю как.
__________________
Будь проще, дойдет и до синтеза.
Последний раз редактировалось marera; 03.03.2022 в 16:09.
|
|
|
|
04.03.2022, 10:33
|
|
Частый гость
Регистрация: 20.11.2011
Адрес: Казань
Сообщений: 36
Сказал спасибо: 65
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Re: Запуск отложенных программ
Команды могут исполняться по очереди? Или необходимо "одновременное" исполнение?
Если по очереди - фигня вопрос. Делаете FIFO буфер, куда запихиваете команды. Раз у вас не более 8, то сделайте буфер на 10 или 16 команд - про запас.
Как команда выполнилась (функция отработала и что-то вернула), сдвигаете буфер и выполняете следующую команду, пока не опустошите буфер.
Поправочка - сразу не заметил, что у вас требуется кольцевое исполнение - делаете не FIFO, а 2 кольцевых буфера. Один для записи поступающих команд, второй - для исполнения. Выбор какой что сейчас делает - по флагу. Если установлен, исполняем из буфера0, в противном случае - из буфера1.
Слушайте, вы сколько программированием занимаетесь, что у вас такие вопросы вообще появляются?
А если вам надо что-то типа параллельного выполнения - FreeRTOS вам в помощь
Последний раз редактировалось LiVit; 04.03.2022 в 10:40.
|
|
|
|
04.03.2022, 16:21
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: Запуск отложенных программ
Сообщение от LiVit
|
Слушайте, вы сколько программированием занимаетесь, что у вас такие вопросы вообще появляются?
|
Хороший вопрос...
Мне не нравится конструкция SWITCH, которая необходима для "простого" сопоставления кода команды с вызовом соответствующей функции.
Функций-то восемь, как и команд, а вот цепочку этих команд хотелось бы удлинить хотя бы до двух десятков и во что превратится SWITCH?
Полагал, что существуют традиционные способы с которыми я не сталкивался. Вот и весь вопрос, а рассказывать про буферы надобности нет.
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
04.03.2022, 16:37
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: Запуск отложенных программ
Пожалуй мои заблуждения рассеиваются. SWITCH - то всегда будет иметь 8 CASEов. А цикл по буферу ограничится только размером буфера. Пожалуй тему можно закрывать, спасибо посочувствовавшим. Хорошо, когда есть с кем поговорить, особенно, когда начинаешь тупить.
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
04.03.2022, 17:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Запуск отложенных программ
8 команд - uint8_t в качестве флага (запускать - не запускать). Пришла команда запускать — выставляем данный флаг. Пришла команда прекратить — снимаем его. А в суперлупе просто перебираем биты флага и запускаем те функции, где единицы..
__________________
Смерть бандеровской мразоте!
|
|
|
|
04.03.2022, 17:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Запуск отложенных программ
Сообщение от marera
|
а вот цепочку этих команд хотелось бы удлинить хотя бы до двух десятков и во что превратится SWITCH?
|
А, т.е. важна еще и последовательность? Типа "ехать прямо, ехать влево" и т.п.?
Ну, тогда завести кольцевой буфер, скажем, на 128 байт: будет максимум 128 команд. Содержимое буфера - индекс в массиве указателей на функции.
Вот только в данном случае не представляю, каким должен быть протокол, чтобы можно было что-то выбрасывать и что-то добавлять. Разве что полностью: ввел команду "стереть содержимое буфера", затем заполняешь, проверяешь, и если все ОК, разрешаешь выполнение...
__________________
Смерть бандеровской мразоте!
|
|
|
|
04.03.2022, 17:42
|
|
Частый гость
Регистрация: 20.11.2011
Адрес: Казань
Сообщений: 36
Сказал спасибо: 65
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Re: Запуск отложенных программ
Сообщение от marera
|
Пожалуй мои заблуждения рассеиваются. SWITCH - то всегда будет иметь 8 CASEов. А цикл по буферу ограничится только размером буфера.
|
Более того, можно обойтись вообще без switch/case.
Немножко заморочно, зато позволяет увеличить количество команд до... ну, скажем так, до существенного размера.
const void(*ALGO_PTR_ARRAY[])(void) = {
(void(*)(void))Algo1,
(void(*)(void))Algo2,
(void(*)(void))Algo3,
(void(*)(void))Algo4,
(void(*)(void))Algo5,
};
Массив ALGO_PTR_ARRAY содержит указатели на функции, которые должны работать в соответствии с принятыми командами.
Вызовем нужный алгоритм:
(*ALGO_PTR_ARRAY[command_num])();
Надеюсь, дальше не нужно объяснять?
Последний раз редактировалось LiVit; 04.03.2022 в 17:44.
|
|
|
|
04.03.2022, 17:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Запуск отложенных программ
Так и есть. Вот, например:
Код:
|
typedef void(*specfpointer)(char *arg);
...
static specfpointer speccmdlist[SCMD_AMOUNT] = {
[SCMD_IGNORE] = addIGN,
[SCMD_DELIGNLIST] = delignlist,
[SCMD_DFU] = bootldr,
[SCMD_FILTER] = add_filter,
[SCMD_CANSPEED] = CANini,
[SCMD_CANID] = canid,
[SCMD_LISTFILTERS] = list_filters,
[SCMD_IGNBUF] = print_ign_buf,
[SCMD_PAUSE] = inpause,
[SCMD_RESUME] = inresume,
[SCMD_SEND] = sendCANcommand,
[SCMD_DUMPCONF] = dump_userconf,
[SCMD_GETCTR] = getcounter,
[SCMD_WD] = wdcheck,
[SCMD_DUMPCMD] = dumpcmdcodes,
[SCMD_DUMPERR] = dumperrcodes,
//[SCMD_ST] = stp_check,
}; |
Ну и дальше просто вызывается speccmdlist[i](arg).
__________________
Смерть бандеровской мразоте!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:02.
|
|