Re: ARM ( v5 ) HACK BL <label>
за тези които им е интересно или мислят да работят с GSM модули - обяснявам ...
в някой ( в повечето ) GSM модули може да се пише и изпълнява UserWare апликация вътре в модула, без контрол от външно MCU в момента най-разпространените SDK ( User API ) са: OpenCPU, ThreadX, Linux ... това си е нормално C/C++ Линукс приложение ( PIC (Position-Independent Code) библиотека ) или static libraries.
при първите две връзката кернел - узер е следната:
OpenCPU: string( "function_foo"... трябва ни тази функция ) = Hash(на стринга) --> има API_Table[ Hash ] - и съответен мост между kernel_foo() и user_foo() ... това накратко
ThreadX: софтуерно прекъсване syscall( функция_номер, функция_параметри ... )
или просто статично линкване на прекомпилирани кернел библиотеки със user appication сорс код
има и "по-прости" PIC ( position-independent code ) User APP като PIC библиотека - разхода е че се зареждат/изпълняват в RAM ...
в повечето потребителски USER_MAIN() е организиран така: ( например: ESP32 )
което си е super loop + rtos task yield <--- това ако го няма - кучето ще ритне "апликацията" или другите задачи няма да се изпълняват
При OpenCPU положението е почти същото
та тук super loop е обработка на съобщения, а yield() го прави GetMessage() прозрачно за нас
какво точно прави GetMessage()
. получаване и обработка на съобщения от кернела и разпределение на USER_MESSAGES между USER_TASKS
. обработка и транслация на периферия ( kernel to user space ) уж защита на ресурси, но без MMU това се обезсмисля...
. ако няма съобщения - блокиране на таска, демек yield()
. ако има съобщение за нас - switch/case някаква си наша обработка на приетото съобщение
GetMessage() може да се замени с task_delay( време )
но таска няма да получава кернел съобщения и няма да може да работи с периферия като UART, TIMERS ... etc, използващи прекъсвания, транслирани то user space като callbacks()
Транслацията на периферията работи така:
в който таск е open( периферия ) то там ще бъде изпратено съобщение и ще се изпълни callback( периферия ) и
само там може да се modify/close( периферия )
забележка: така са го "измислили" джигитайците ... уж защита на ресурси, макар че разработката не е джигитайска ( нямат толкова акъл ) ... автор неизвестен ...
реално има две фунции GetMessage(&msg)
OS kernel_GetMessage( нямаме достъп до тази ) и
APP user_GetMessage( с тази работим ) тази е само "мост" / API към kernel_GetMessage() която прави следното накратко
та
WAIT_FOREVER предизвика моя "проблем"
няма как да се изпълнява Ардуино loop(); що то таска е блокирал преди или след него
простото/тъпо решение беше да изпращам винаги едно празно съобщение в опашката на OS_TASK_n_QUEUE,
ако има нещо, кернела си го обработва, ако "няма" ... но "винаги" има едно мое "празно" съобщение от което kernel_GetMessage() излиза и изпълнава loop()
и те така...
някой ще кажат:
Защо Ардуино или Ардуино не е "по-по-най" за "индустриални" цели ... но това е друга тема