diff --git a/capitol_4.tex b/capitol_4.tex index 1378d33..f27f630 100644 --- a/capitol_4.tex +++ b/capitol_4.tex @@ -269,7 +269,7 @@ \subsection{Semàfors a FreeRTOS} \subsection{Exemple amb semàfors} \label{sub:semafors_exemple} -A \href{https://github.com/mariusmm/cursembedded/tree/master/Simplicity/FreeRTOS_Semaphore}{l'exemple} hi ha una tasca que es queda esperant a agafar un semàfor i quan l'aconsegueix fa un {\em toggle} del LED (Veure Llistat~\ref{semaphore_task_example}). +A \href{https://github.com/mariusmm/cursembedded/tree/master/Simplicity/FreeRTOS_Semaphore}{l'exemple} hi ha una tasca que es queda esperant a agafar un semàfor i quan l'aconsegueix fa un {\em toggle} del LED (veure Llistat~\ref{semaphore_task_example} i el diagrama de seqüència~\ref{fig:SeqDiagramSemaphore}). \index{TaskLedToggle()}\index{xSemaphoreTake()}\index{LedToggle()} \begin{lstlisting}[style=customc,caption=Tasca amb semàfor d'exemple,label=semaphore_task_example] @@ -283,6 +283,15 @@ \subsection{Exemple amb semàfors} } \end{lstlisting} + +\begin{figure} + \centering + \includegraphics[width=0.85\textwidth, keepaspectratio]{imatges/SemaphoreFreeRTOS.png} + \caption{Diagrama de seqüència de l'exemple amb semàfors}. + \label{fig:SeqDiagramSemaphore} +\end{figure} + + La funció {\bf main()}\index{main()} crida la funció {\bf BSP\_Init()}\index{BSP\_Init()} que configura els GPIOs corresponents als botons i es registra una \gls{ISR} ({\bf GPIO\_EVEN\_IRQHandler()}\index{GPIO\_EVEN\_IRQHandler()}) pel botó 0, que ‘dóna' el semàfor en quan es prem el corresponent botó a la PCB (Llistat~\ref{ISR_semaphore}). Després es crea el semàfor que compartiran la tasca i la ISR i tot seguit es crea la tasca com ja hem vist a l'exemple anterior.. @@ -334,7 +343,7 @@ \section{Cues} Per saber quina mida han de tenir les cues, veieu \fullref{sec:mida_cues}. \subsection{Exemple amb cues} \label{sub:cues_exemple} -A \href{https://github.com/mariusmm/cursembedded/tree/master/Simplicity/FreeRTOS_Queue}{l'exemple de cues} hi ha una sola tasca que fa {\em blinkar} el \gls{LED} segons una variable. Aquesta variable s'obté de llegir (o intentar-ho) una cua. Aquesta cua (anomenada {\em queue\_buttons}) l'escriuen les dues \gls{ISR} associades als dos botons. Una envia el valor corresponent a 250 ms i l'altre ISR envia el valor que correspon a 1000 ms (Llistat~\ref{Queue_example_ISR}). +A \href{https://github.com/mariusmm/cursembedded/tree/master/Simplicity/FreeRTOS_Queue}{l'exemple de cues} hi ha una sola tasca que fa {\em blinkar} el \gls{LED} segons una variable. Aquesta variable s'obté de llegir (o intentar-ho) una cua. Aquesta cua (anomenada {\em queue\_buttons}) l'escriuen les dues \gls{ISR} associades als dos botons. Una envia el valor corresponent a 250 ms i l'altre ISR envia el valor que correspon a 1000 ms (Llistat~\ref{Queue_example_ISR} i diagrama de seqüència~\ref{fig:SeqDiagramQueue}). \index{xQueueSendFromISR()}\index{portYIELD\_FROM\_ISR()} \begin{lstlisting}[style=customc, label=Queue_example_ISR, caption=Part del codi d'una de les ISRs] @@ -349,6 +358,13 @@ \subsection{Exemple amb cues} \end{lstlisting} +\begin{figure} + \centering + \includegraphics[width=0.85\textwidth, keepaspectratio]{imatges/QueueFreeRTOS.png} + \caption{Diagrama de seqüència de l'exemple de {\em debounce}} + \label{fig:SeqDiagramQueue} +\end{figure} + En aquest cas, la tasca fa servir la funció {\bf xQueueReceive()}\index{xQueueReceive()} amb un valor de 0 a l'últim paràmetre, que és el temps en {\em ticks} que ha d'esperar-se a rebre un valor en el cas que la cua estigui buida (veure Llistat~\ref{queue_example_main}). \index{xQueueReceive()}\index{vTaskDelay()}\index{LedToggle()}\index{TaskLedToggle()} diff --git a/imatges/QueueFreeRTOS.png b/imatges/QueueFreeRTOS.png new file mode 100644 index 0000000..d7537b7 Binary files /dev/null and b/imatges/QueueFreeRTOS.png differ diff --git a/imatges/SemaphoreFreeRTOS.png b/imatges/SemaphoreFreeRTOS.png new file mode 100644 index 0000000..93967a7 Binary files /dev/null and b/imatges/SemaphoreFreeRTOS.png differ diff --git a/plantuml/QueueFreeRTOS.plantuml b/plantuml/QueueFreeRTOS.plantuml new file mode 100644 index 0000000..6bb516e --- /dev/null +++ b/plantuml/QueueFreeRTOS.plantuml @@ -0,0 +1,41 @@ +' FreeRTOS Queue example + +@startuml + +skinparam sequence { +ArrowColor #009944 +ActorBorderColor #009944 +LifeLineBorderColor #009944 +LifeLineBackgroundColor #00AA55 +ParticipantBorderColor #009944 +ParticipantBackgroundColor #00AA55 +EntityBorderColor #009944 +EntityBackgroundColor #00AA55 +} + +participant Tasca1 order 1 +entity Queue order 2 +participant GPIO_ODD_ISR order 3 +participant GPIO_EVEN_ISR order 4 +activate Tasca1 +||| +Tasca1 -> Queue: xQueueReceive() +deactivate Tasca1 + +||| +GPIO_ODD_ISR o<--]: IRQ_ODD +activate GPIO_ODD_ISR + +GPIO_ODD_ISR -> Queue: xQueueSendFromISR() +Queue --> GPIO_ODD_ISR +Queue --> Tasca1 +destroy GPIO_ODD_ISR +activate Tasca1 + +GPIO_EVEN_ISR o<--]: IRQ_EVEN +activate GPIO_EVEN_ISR +GPIO_EVEN_ISR -> Queue: xQueueSendFromISR() +Queue --> GPIO_EVEN_ISR +destroy GPIO_EVEN_ISR + +@enduml diff --git a/plantuml/SemaphoreFreeRTOS.plantuml b/plantuml/SemaphoreFreeRTOS.plantuml new file mode 100644 index 0000000..419921d --- /dev/null +++ b/plantuml/SemaphoreFreeRTOS.plantuml @@ -0,0 +1,36 @@ +' FreeRTOS Semaphore example + +@startuml + +skinparam sequence { +ArrowColor #009944 +ActorBorderColor #009944 +LifeLineBorderColor #009944 +LifeLineBackgroundColor #00AA55 +ParticipantBorderColor #009944 +ParticipantBackgroundColor #00AA55 +EntityBorderColor #009944 +EntityBackgroundColor #00AA55 +} + +participant Tasca1 order 1 +entity Semaphore order 2 +participant GPIO_ISR order 3 +activate Tasca1 +||| +Tasca1 -> Semaphore: xSemaphoreTake() +deactivate Tasca1 + +||| +GPIO_ISR o<--]: IRQ +activate GPIO_ISR + +GPIO_ISR-> Semaphore: xSemaphoreGiveFromISR() +Semaphore --> GPIO_ISR +Semaphore --> Tasca1 +destroy GPIO_ISR +activate Tasca1 + + + +@enduml