×

Внимание

Форум находится в режиме только для чтения.

Программный стек для управления GSM модулем (окончание банкета)

11 года 7 мес. назад #4103 от Алена
В продолжение новостей от [iurl=http://www.promelec.ru/company/news/1095/]07.12.2012г[/iurl]. и [iurl=http://www.promelec.ru/company/news/1060/]28.01.2013г.[/iurl] инженеры компании "Промэлектроника" написали небольшой программный стек по объединению продукции STMicroelectronics и Quectel. В качестве контроллера был взят [iurl=http://www.promelec.ru/catalog/1/11/1777/0/150573/#150573]STM32F051R8T6[/iurl], а в качестве модуля GSM связи – [iurl=http://www.promelec.ru/catalog/1640/1668/1671/0/148904/#148904]M95[/iurl]. На базе этого железа был построен элемент охранной системы: SMS оповещение одного абонента сотовой связи при замыкании/размыкании двух проводов («сухие контакты»).
[iurl=http://www.promelec.ru/company/news/1135/]
Оригинал новости[/iurl]

[jwp=425,344,image]www.promelec.ru/UPLOAD/video/DSCN6358.flv[/jwp]
11 года 7 мес. назад #4105 от newseltek
А выложить-то его можно ?
11 года 7 мес. назад #4108 от SiN0

А выложить-то его можно ?

Видимо не дадут, судя по написанному в тексте: 

Получилась такая вот небольшая операционная система, которую мы можем предложить потенциальному заказчику по запросу.

А видео зачётно сняли  :D. Хоть бы повернули.
11 года 7 мес. назад #4113 от admin

А видео зачётно сняли  :D. Хоть бы повернули.

но ведь все видно? ;)
11 года 7 мес. назад #4121 от SiN0
Раз стек выкладываться не будет, то объясните, как организовать по рис.2 по ссылке www.promelec.ru/company/news/1135/ работу программы?
Интересует пример на Си. Т.е. хотя бы структуру, как организовать переходы и вызовы при получении той или иной AT команды от модема и их зависимость от состояние модуля, фиксируемого в программе в переменной.
11 года 7 мес. назад #4126 от Денис Ягов
кусок ядра обработчика:
FLAG = 0;
FLAG1 = 0;
I = 0;
while ((I<ProceesMashine_Buffer.LEN)&&(FLAG==0))
{
  // указатель на строку из библиотеки строк, подлежащую сравнению
  B = (Message_TypeDef*) (*((uint32_t*)(ProceesMashine_Buffer.Messages)+I));

    if (Compare_Rx_Buffer(B)==SUCCESS)
    {
      // поднимаем флаг о выходе из цикла
      FLAG = 1;
      FLAG1 = 1;
      // вычисляем адрес вызываемой функции
      ADDR_FUNC = (uint32_t)(*(uint32_t*)(ProceesMashine_Buffer.Functions+(I*sizeof(uint32_t*))));
      // осуществляем переход в функцию, адрес которой находится в переменной ADDR_FUNC
      Jump_Addr();
    }
  I++;

}
Смысл процедуры простой: при совпадении строк - прыгаем в некий адрес, где
ProceesMashine_Buffer.LEN - длина состояния (сколько строк подлежит сравнению)
ProceesMashine_Buffer.Functions - указатель на таблицу указателей функций
Compare_Rx_Buffer() - функция сравнения буфера с некой строкой
ADDR_FUNC - переменная в которой хранится адрес вызываемой функции
Сравниваемые строки: B и буфер приёма.
Сам переход в функцию-обработчик осуществляется функцией Jump_Addr().
Я потратил день чтобы написать это дело на Си - неудачно и 5 минут на ассемблере (удачно):

        EXTERN ADDR_FUNC        // это переменная, которая хранит адрес функции в который надо прыгнуть
        PUBLIC  Jump_Addr       // метка функции, которая осуществляет прыг по адресу ADDR_FUNC
   
        section MYCODE:CODE(6)
Jump_Addr
        LDR     R0, =ADDR_FUNC  // грузим адрес переменной ADDR_FUNC
        LDR     R0, [R0]        // грузим значение переменной
        BX      R0              // прагаем
        // возврат из вызванной процедуры будет по значению регистра LR (он указывает на место откуда была вызвана данная функция)
        // поэтому дополнительного кода возврата - не требуется
        end
Время создания страницы: 0.044 секунд
Работает на Kunena форум