From 29f255962f106a8cbebd90a629db3a03ec485459 Mon Sep 17 00:00:00 2001 From: Krishna Narayanan <krishnanarayanan132002@gmail.com> Date: Mon, 8 Aug 2022 05:02:51 -0400 Subject: [PATCH] Updated simpPRU Documentation --- simppru-examples/button_click_rpmsg.rst | 11 +- simppru-examples/delay.rst | 11 +- simppru-examples/digital_read.rst | 12 +- simppru-examples/digital_write.rst | 12 +- simppru-examples/hcsr04_example_rpmsg.rst | 11 +- simppru-examples/hcsr04_sensor.rst | 11 +- simppru-examples/images/simpPRU.png | Bin 0 -> 33174 bytes simppru-examples/index.rst | 53 +++----- simppru-examples/led_blink.rst | 12 +- simppru-examples/led_blink_button.rst | 13 +- simppru-examples/led_blink_counter.rst | 13 +- simppru-examples/led_blink_for.rst | 13 +- simppru-examples/led_blink_while.rst | 12 +- simppru/index.rst | 2 +- simppru/io.rst | 152 ---------------------- simppru/language.rst | 127 +++++++++--------- simppru/usage-simppru-console.rst | 51 +++++--- simppru/usage-simppru.rst | 2 +- 18 files changed, 167 insertions(+), 351 deletions(-) create mode 100644 simppru-examples/images/simpPRU.png diff --git a/simppru-examples/button_click_rpmsg.rst b/simppru-examples/button_click_rpmsg.rst index f21807fb..ac10f3f3 100644 --- a/simppru-examples/button_click_rpmsg.rst +++ b/simppru-examples/button_click_rpmsg.rst @@ -1,12 +1,11 @@ Sending state of button using RPMSG =================================== -!!! info “Schematic†=== “Pocket Beagle†|image0| - -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  +.. image:: images/led_button_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: Sending state of button using RPMSG Code ---- diff --git a/simppru-examples/delay.rst b/simppru-examples/delay.rst index 7d6ead6c..2f04b3bb 100644 --- a/simppru-examples/delay.rst +++ b/simppru-examples/delay.rst @@ -1,12 +1,12 @@ Delay example ============= -!!! info “Schematic†=== “Pocket Beagle†|image0| +.. image:: images/led_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: Delay example -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  Code ---- @@ -30,4 +30,3 @@ using the ``delay`` call, after that it writes LOW to header pin P1_31, then again waits for 5000ms using the ``delay`` call, and finally writes HIGH to header pin P1_31. -.. |image0| image:: images/led_pocket_beagle.png \ No newline at end of file diff --git a/simppru-examples/digital_read.rst b/simppru-examples/digital_read.rst index c3993061..9563db3a 100644 --- a/simppru-examples/digital_read.rst +++ b/simppru-examples/digital_read.rst @@ -1,12 +1,11 @@ Digital read example ==================== -!!! info “Schematic†=== “Pocket Beagle†|image0| - -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  +.. image:: images/led_button_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: Digital read example Code ---- @@ -33,4 +32,3 @@ This code runs a never ending loop, since it is ``while : true``. Inside P1_29 is HIGH, header pin P1_31 is set to LOW, and if header pin P1_29 is LOW, header pin P1_31 is set to HIGH. -.. |image0| image:: images/led_button_pocket_beagle.png \ No newline at end of file diff --git a/simppru-examples/digital_write.rst b/simppru-examples/digital_write.rst index 45997aa5..154ad1b1 100644 --- a/simppru-examples/digital_write.rst +++ b/simppru-examples/digital_write.rst @@ -1,12 +1,11 @@ Digital write example ===================== -!!! info “Schematic†=== “Pocket Beagle†|image0| - -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  +.. image:: images/led_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: Digital write example Code ---- @@ -26,4 +25,3 @@ Explaination This code runs a never ending loop, since it is ``while : true``. Inside ``while`` it sets header pin P1_31 to HIGH. -.. |image0| image:: images/led_pocket_beagle.png diff --git a/simppru-examples/hcsr04_example_rpmsg.rst b/simppru-examples/hcsr04_example_rpmsg.rst index 91fa3ecc..4f54acc2 100644 --- a/simppru-examples/hcsr04_example_rpmsg.rst +++ b/simppru-examples/hcsr04_example_rpmsg.rst @@ -1,12 +1,11 @@ HCSR04 Distance Sensor example (sending distance data to ARM using RPMSG) ========================================================================= -!!! info “Schematic†=== “Pocket Beagle†|image0| - -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  +.. image:: images/hcsr04_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: HCSR04 Distance Sensor example Code ---- diff --git a/simppru-examples/hcsr04_sensor.rst b/simppru-examples/hcsr04_sensor.rst index b246c1ca..f2005a9c 100644 --- a/simppru-examples/hcsr04_sensor.rst +++ b/simppru-examples/hcsr04_sensor.rst @@ -1,12 +1,11 @@ Ultrasonic range sensor example =============================== -!!! info “Schematic†=== “Pocket Beagle†|image0| - -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  +.. image:: images/hcsr04_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: Ultrasonic range sensor example Code ---- diff --git a/simppru-examples/images/simpPRU.png b/simppru-examples/images/simpPRU.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd57d860b6b740b9d44ad037cc5d709722ff060 GIT binary patch literal 33174 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 Cx56g? literal 0 HcmV?d00001 diff --git a/simppru-examples/index.rst b/simppru-examples/index.rst index 82f85932..c0bc8b26 100644 --- a/simppru-examples/index.rst +++ b/simppru-examples/index.rst @@ -3,53 +3,32 @@ simpPRU Examples ############## -The PRU is a dual core micro-controller system present on the AM335x SoC -which powers the BeagleBone. It is meant to be used for high speed -jitter free IO control. Being independent from the linux scheduler and -having direct access to the IO pins of the BeagleBone Black, the PRU is -ideal for offloading IO intensive tasks. - -Programming the PRU is a uphill task for a beginner, since it involves -several steps, writing the firmware for the PRU, writing a loader -program. This can be a easy task for a experienced developer, but it -keeps many creative developers away. So, I propose to implement a easy -to understand language for the PRU, hiding away all the low level stuff -and providing a clean interface to program PRU. - -This can be achieved by implementing a language on top of PRU C. It will -directly compile down to PRU C. This could also be solved by -implementing a bytecode engine on the PRU, but this will result in waste -of already limited resources on PRU. With this approach, both PRU cores -can be run independent of each other. +These are the examples which have been tested on simpPRU.These examples will serve as a guide for the users to implement. + .. image:: images/simpPRU.png :width: 398 :align: center :height: 200 - :alt: simpPRU - - -What is simpPRU ---------------- - -- simpPRU is a procedural programming language. -- It is a statically typed language. Variables and functions must be - assigned data types during compilation. -- It is typesafe, and data types of variables are decided during - compilation. -- simPRU codes have a ``.sim`` extension. -- simpPRU provides a console app to use Remoteproc functionality. + :alt: simpPRU Examples .. toctree:: :maxdepth: 1 - build.rst - install.rst - language.rst - io.rst - usage-simppru.rst - usage-simppru-console.rst + delay.rst + digital_read.rst + digital_write.rst + hcsr04_example_rpmsg.rst + hcsr04_sensor.rst + button_click_rpmsg.rst + led_blink_button.rst + led_blink_for.rst + led_blink_while.rst + led_blink.rst + read_counter.rst + rpmsg_example.rst + rpmsg_pru_calculator.rst diff --git a/simppru-examples/led_blink.rst b/simppru-examples/led_blink.rst index 39fa6625..28f49776 100644 --- a/simppru-examples/led_blink.rst +++ b/simppru-examples/led_blink.rst @@ -1,12 +1,11 @@ LED blink example ================= -!!! info “Schematic†=== “Pocket Beagle†|image0| - -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  +.. image:: images/led_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: LED blink example Code ---- @@ -31,4 +30,3 @@ This code runs a never ending loop, since it is ``while : true``. Inside header pin P1_31 to LOW, then again it waits for 1000ms. This loop runs endlessly, so we get a Blinking output if one connects a LED -.. |image0| image:: images/led_pocket_beagle.png diff --git a/simppru-examples/led_blink_button.rst b/simppru-examples/led_blink_button.rst index 45374e34..915a813e 100644 --- a/simppru-examples/led_blink_button.rst +++ b/simppru-examples/led_blink_button.rst @@ -1,12 +1,11 @@ LED blink on button press example ================================= -!!! info “Schematic†=== “Pocket Beagle†|image0| - -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  +.. image:: images/led_button_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: LED blink on button press example Code ---- @@ -34,5 +33,3 @@ HIGH, waits for 1000ms, then sets header pin P1_31 to LOW, then again it waits for 1000ms. This loop runs endlessly as long as header pin P1_29 is HIGH, so we get a Blinking output if one connects a LED to output pin. - -.. |image0| image:: images/led_button_pocket_beagle.png diff --git a/simppru-examples/led_blink_counter.rst b/simppru-examples/led_blink_counter.rst index a2641cf1..3719694e 100644 --- a/simppru-examples/led_blink_counter.rst +++ b/simppru-examples/led_blink_counter.rst @@ -1,12 +1,11 @@ LED blink using hardware counter ================================ -!!! info “Schematic†=== “Pocket Beagle†|image0| - -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  +.. image:: images/led_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: LED blink using hardware counter Code ---- @@ -49,5 +48,3 @@ loop. Here, we check if ``read_counter`` is less than 200000000, as counter takes exactly 1 second to count this much cycles, so basically the LED is turned on for 1 second, and then turned off for 1 second. Thus if a LED is connected to the pin, we get a endlessly blinking LED. - -.. |image0| image:: images/led_pocket_beagle.png diff --git a/simppru-examples/led_blink_for.rst b/simppru-examples/led_blink_for.rst index dda15efb..18a774cb 100644 --- a/simppru-examples/led_blink_for.rst +++ b/simppru-examples/led_blink_for.rst @@ -1,14 +1,12 @@ LED blink using for loop example ================================ -!!! info “Schematic†=== “Pocket Beagle†|image0| - -:: - - === "BeagleBone Black / Beagle Bone Black Wireless" -  +.. image:: images/led_pocket_beagle.png + :width: 598 + :align: center + :height: 400 + :alt: LED blink using while loop example Code ---- @@ -31,4 +30,3 @@ Inside ``while`` it sets header pin P1_31 to HIGH, waits for 1000ms, then sets header pin P1_31 to LOW, then again it waits for 1000ms. This loop runs endlessly, so we get a Blinking output if one connects a LED -.. |image0| image:: images/led_pocket_beagle.png diff --git a/simppru/index.rst b/simppru/index.rst index fd36882a..d8e953f4 100644 --- a/simppru/index.rst +++ b/simppru/index.rst @@ -37,7 +37,7 @@ What is simpPRU assigned data types during compilation. - It is typesafe, and data types of variables are decided during compilation. -- simPRU codes have a ``.sim`` extension. +- simpPRU codes have a ``.sim`` extension. - simpPRU provides a console app to use Remoteproc functionality. diff --git a/simppru/io.rst b/simppru/io.rst index 8b7e63e6..fe2e8410 100644 --- a/simppru/io.rst +++ b/simppru/io.rst @@ -1,158 +1,6 @@ IO Functions ============ -PRU<->Header pin mappings -------------------------- - -=== “PocketBeagle†=== “PRU0†\| R30 Register bit (Output) \| R31 -Register bit (Input) \| Header pin \| \| :————–: \| :————–: \| :——–: \| -\| - \| 16 \| P1_20 \| \| 7 \| 7 \| P1_29 \| \| 4 \| 4 \| P1_31 \| \| 1 -\| 1 \| P1_33 \| \| 0 \| 0 \| P1_36 \| \| - \| 15 \| P2_18 \| \| 15 \| - -\| P2_33 \| \| - \| 14 \| P2_22 \| \| 14 \| - \| P2_24 \| \| 6 \| 6 \| -P2_28 \| \| 3 \| 3 \| P2_30 \| \| 2 \| 2 \| P2_32 \| \| 5 \| 5 \| P2_34 -\| - -:: - - === "PRU1" - | R30 Register bit (Output) | R31 Register bit (Input) | Header pin | - | :--------------: | :--------------: | :--------: | - | 9 | 9 | P1_02 | - | 11 | 11 | P1_04 | - | 15 | 15 | P1_30 | - | 14 | 14 | P1_32 | - | 10 | 10 | P1_35 | - | - | 16 | P2_31 | - | 8 | 8 | P2_35 | - -=== “BeagleBone Black†=== “PRU0†\| R30 Register bit (Output) \| R31 -Register bit (Input) \| Header pin \| \| :————–: \| :————–: \| :——–: \| -\| - \| 15 \| P8_15 \| \| 15 \| - \| P8_11 \| \| - \| 14 \| P8_16 \| \| -14 \| - \| P8_12 \| \| 7 \| 7 \| P9_25 \| \| 5 \| 5 \| P9_27 \| \| 3 \| -3 \| P9_28 \| \| 1 \| 1 \| P9_29 \| \| 2 \| 2 \| P9_30 \| \| 0 \| 0 \| -P9_31 \| \| 6 \| 6 \| P9_41 \| \| 4 \| 4 \| P9_42 \| - -:: - - === "PRU1" - | R30 Register bit (Output) | R31 Register bit (Input) | Header pin | - | :--------------: | :--------------: | :--------: | - | 13 | 13 | P8_20 | - | 12 | 12 | P8_21 | - | 8 | 8 | **P8_27 | - | 10 | 10 | **P8_28 | - | 9 | 9 | **P8_29 | - | 6 | 6 | **P8_39 | - | 7 | 7 | **P8_40 | - | 4 | 4 | **P8_41 | - | 5 | 5 | **P8_42 | - | 2 | 2 | **P8_43 | - | 3 | 3 | **P8_44 | - | 0 | 0 | **P8_45 | - | 1 | 1 | **P8_46 | - - ** Before using these pins, you need to disable HDMI functionality. - You can read how to do this [here](https://archive.vn/D8Bzy) - -=== “BeagleBone Black Wireless†=== “PRU0†\| R30 Register bit (Output) -\| R31 Register bit (Input) \| Header pin \| \| :————–: \| :————–: \| -:——–: \| \| - \| 15 \| P8_15 \| \| 15 \| - \| P8_11 \| \| - \| 14 \| -P8_16 \| \| 14 \| - \| P8_12 \| \| 7 \| 7 \| P9_25 \| \| 5 \| 5 \| P9_27 -\| \| 3 \| 3 \| P9_28 \| \| 1 \| 1 \| P9_29 \| \| 2 \| 2 \| P9_30 \| \| -0 \| 0 \| P9_31 \| \| 6 \| 6 \| P9_41 \| \| 4 \| 4 \| P9_42 \| - -::/home/krishna/docs.beagleboard.io/simppru/usage/images - - === "PRU1" - | R30 Register bit (Output) | R31 Register bit (Input) | Header pin | - | :--------------: | :--------------: | :--------: | - | 13 | 13 | P8_20 | - | 12 | 12 | P8_21 | - | 8 | 8 | **P8_27 | - | 10 | 10 | **P8_28 | - | 9 | 9 | **P8_29 | - | 6 | 6 | **P8_39 | - | 7 | 7 | **P8_40 | - | 4 | 4 | **P8_41 | - | 5 | 5 | **P8_42 | - | 2 | 2 | **P8_43 | - | 3 | 3 | **P8_44 | - | 0 | 0 | **P8_45 | - | 1 | 1 | **P8_46 | - - ** Before using these pins, you need to disable HDMI functionality. - You can read how to do this [here](https://archive.vn/D8Bzy) - -=== “BeagleBone AI†=== “PRU0†\| R30 Register bit (Output) \| R31 -Register bit (Input) \| Header pin \| \| :————–: \| :————–: \| :——–: \| -\| 3 \| 3 \| P8_12 \| \| 4 \| 4 \| P8_11 \| \| 5 \| 5 \| P9_15 \| \| 17 -\| 17 \| P9_26 \| - -:: - - === "PRU1" - | R30 Register bit (Output) | R31 Register bit (Input) | Header pin | - | :--------------: | :--------------: | :--------: | - | 1 | 1 | P9_20 | - | 2 | 2 | P9_19 | - | 3 | 3 | P9_41 | - | 5 | 5 | P8_18 | - | 6 | 6 | P8_19 | - | 7 | 7 | P8_13 | - | 9 | 9 | P8_14 | - | 10 | 10 | P9_42 | - | 11 | 11 | P9_27 | - | 14 | 14 | P9_14 | - | 15 | 15 | P9_16 | - | 16 | 16 | P8_15 | - | 17 | 17 | P8_26 | - | 18 | 18 | P8_16 | - - === "PRU2" - | R30 Register bit (Output) | R31 Register bit (Input) | Header pin | - | :--------------: | :--------------: | :--------: | - | 10 | 10 | P8_33 | - | 11 | 11 | P8_31 | - | 6 | 6 | P8_38 | - | 7 | 7 | P8_36 | - | 20 | 20 | P8_08 | - | 15 | 15 | P9_13 | - | 3 | 3 | P8_39 | - | 2 | 2 | P8_42 | - | 9 | 9 | P8_35 | - | 8 | 8 | P8_34 | - | 5 | 5 | P8_37 | - | 4 | 4 | P8_40 | - | 17 | 17 | P8_28 | - | 18 | 18 | P8_29 | - | 19 | 19 | P8_30 | - | 1 | 1 | P8_41 | - | 0 | 0 | P8_44 | - | 14 | 14 | P9_11 | - - === "PRU3" - | R30 Register bit (Output) | R31 Register bit (Input) | Header pin | - | :--------------: | :--------------: | :--------: | - | 0 | 0 | P8_32 | - | 5 | 5 | P9_25 | - | 6 | 6 | P8_09 | - | 10 | 10 | P9_31 | - | 8 | 8 | P9_18 | - | 16 | 16 | P8_07 | - | 15 | 15 | P8_10 | - | 17 | 17 | P8_27 | - | 20 | 20 | P8_43 | - | 18 | 18 | P8_45 | - | 19 | 19 | P8_46 | - | 9 | 9 | P9_17 | - | 13 | 13 | P9_28 | - | 11 | 11 | P9_29 | - | 12 | 12 | P9_30 | - - ** Before using these pins, you need to disable HDMI functionality. - You can read how to do this [here](https://archive.vn/D8Bzy) - - - All Header pins are ``constant integer variable`` by default, with its value equal to respective R30/R31 register bit diff --git a/simppru/language.rst b/simppru/language.rst index ead310a4..0dc4895b 100644 --- a/simppru/language.rst +++ b/simppru/language.rst @@ -14,8 +14,7 @@ Datatypes - ``int`` - Integer datatype - ``bool`` - Boolean datatype - ``char`` / ``uint8`` - Character / Unsigned 8 bit integer datatype -- ``void`` - Void datatype, can only be used a return type for - functions +- ``void`` - Void datatype, can only be used a return type for functions Constants --------- @@ -27,8 +26,7 @@ Constants - ``true`` - Boolean constant (True) - ``false`` - Boolean constant (False) - ``Px_yz`` - Pin mapping constants are Integer constant, where x is - 1,2 or 8,9 and yz are the header pin numbers. For further details - refer to `this <io.md>`__ + 1,2 or 8,9 and yz are the header pin numbers. Operators --------- @@ -81,8 +79,7 @@ Variable declaration ``boolean`` by default. - Variables can be assigned other variables of same datatype. ``int``\ s and ``char``\ s can be assigned to each other. -- Variables can be assigned expressions whose output is of same - datatype. +- Variables can be assigned expressions whose output is of same datatype. Declaration ~~~~~~~~~~~ @@ -147,8 +144,7 @@ Indexing: - Arrays are zero-indexed. -- The index can be either a char or an int or an expression involving - chars and ints. +- The index can be either a char or an int or an expression involving chars and ints. - Accessing elements of an array: @@ -269,8 +265,7 @@ Boolean expressions => 'a' < 'b'; true -!!! Note Expressions are evaluated following the `operator -precedence <#operators>`__ +- **Note** : Expressions are evaluated following the `operator precedence <#operators>` If-else statement ----------------- @@ -373,9 +368,7 @@ Syntax .... } -!!! Note **var** is a **integer**, and **start, stop, increment** can be -**arithmetic expression, integer or character variable, or integer or -character constant**. +- **Note** : **var** is a **integer**, and **start, stop, increment** can be **arithmetic expression, integer or character variable, or integer or character constant**. .. _examples-1: @@ -410,8 +403,7 @@ Examples While-loop statement -------------------- -While loop statement repeatedly executes a target statement as long as a -given condition is true. +While loop statement repeatedly executes a target statement as long as a given condition is true. .. _syntax-2: @@ -453,8 +445,7 @@ Examples Control statements ------------------ -!!! Note ``break`` and ``continue`` can only be used inside looping -statements +- **Note** : ``break`` and ``continue`` can only be used inside looping statements break ~~~~~ @@ -525,7 +516,7 @@ declaration tells the compiler about a function’s name, return type, and parameters. A function definition provides the actual body of the function. -!!! warning Function must be defined before calling it. +- **Warning** : Function must be defined before calling it. .. _syntax-5: @@ -542,27 +533,36 @@ Syntax return <data_type>; } -!!! Note If return data type is void, then return statement is not +- **Note** : If return data type is void, then return statement is not needed, and if still it is added, it must be return nothing, i.e., something like this ``return ;`` -!!! Warning ``return`` can only be present in the body of the function +- **Warning** : ``return`` can only be present in the body of the function only once, that too at the end of the function, not inside any compound statements. -!!! fail “Wrong†\* ``return`` inside a compound statement, this syntax -is not allowed. -``python def test : int : int a { if : a < 4 { return a; } }`` +- **Wrong** : ``return`` inside a compound statement, this syntax is not allowed. -!!! done “Correct†\* ``return`` is not inside compound statments, It -should be placed only at the end of function definition \```python def -test : int : int a { int gf := 8; if : a < 4 { gf := 4; } +.. code:: python + + def test : int : int a { + if : a < 4 { + return a; + } + } -:: +- **Correct** : ``return`` is not inside compound statments, It should be placed only at the end of function definition - return gf; +.. code:: python + + def test : int : int a { + int gf := 8; + if : a < 4 + { + gf := 4; + } + return gf; } - ``` .. _examples-5: @@ -571,52 +571,52 @@ Examples Examples according to return types -=== “Integer†\```python def test_func : int : int a, int b { int aa := -a + 5; +- **Integer** -:: +.. code:: python - if : aa < 3 { + def test_func : int : int a, int b + { + int aa := a + 5; + if : aa < 3 { aa : = 0; - } + } - return aa + b; + return aa + b; } - ``` -=== “Character†\```python def next_char : char : char ch, int inc { -char chinc := ch + inc; +- **Character** -:: +.. code:: python - return chinc; + def next_char : char : char ch, int inc { + char chinc := ch + inc; + return chinc; } - ``` -=== “Boolean†\```python def compare : bool : int val { bool ret := -false; -:: +- **Boolean** - if : val < 0 { - ret := true; - } +.. code:: python - return ret; - } - ``` + def compare : bool : int val { + bool ret :=false; + if : val < 0 { + ret := true; + } + return ret; + } + -=== “Void†\```python def example_func : void : bool qu { if : qu and -true { … do something … } } +- **Void** -:: +.. code:: python def example_func_v : void : { int temp := 90; return; } - ``` Function call ~~~~~~~~~~~~~ @@ -639,24 +639,19 @@ Syntax Examples ^^^^^^^^ -We will consider functions defined in earlier -`subsection <#examples_5>`__ - -=== “Integer†-``python int a := 55; int ret_val := test_func(4, a);`` +- **Integer** ``int a := 55; int ret_val := test_func(4, a);`` -=== “Character†-``python char a := 'a'; char b := next_char(a, 1);`` +- **Character** ``char a := 'a'; char b := next_char(a, 1);`` -=== “Boolean†``python bool val := compare(22); compare(-2);`` +- **Boolean** ``bool val := compare(22); compare(-2);`` -=== “Void†``python example_func(false); example_func_v();`` +- **Void** ``example_func(false); example_func_v();`` Testing or Debugging ~~~~~~~~~~~~~~~~~~~~ -For testing or debugging code, use the –test or -t flag to enable print, -println and stub functions. Use –preprocess to stop after generating the +For testing or debugging code, use the --test or -t flag to enable print, +println and stub functions. Use --preprocess to stop after generating the C code only. Then run the generated C code (at /tmp/temp.c) using ``gcc``. @@ -683,4 +678,4 @@ Stub functions ^^^^^^^^^^^^^^ PRU specific functions will be replaced by stub functions which print -“function_name called with arguments arg_name†when called. +**function_name called with arguments arg_name** when called. diff --git a/simppru/usage-simppru-console.rst b/simppru/usage-simppru-console.rst index 22f72965..9099c880 100644 --- a/simppru/usage-simppru-console.rst +++ b/simppru/usage-simppru-console.rst @@ -1,4 +1,4 @@ -Usage +Usage(simppru-console) ===== simppru-console is a console app, it can be used to send/receive message @@ -6,10 +6,13 @@ to the PRU using RPMSG, and also start/stop the PRU. It is built to facilitate easier way to use rpmsg and remoteproc API's to control and communicate with the PRU -!!! Warning Make sure to stop PRU before exiting. Press ``ctrl+c`` to -exit +- **Warning** : Make sure to stop PRU before exiting. Press ``ctrl+c`` to exit -|image0| +.. image:: images/main_screen.png + :width: 598 + :align: center + :height: 400 + :alt: Main Screen Features -------- @@ -22,7 +25,11 @@ Start/stop buttons Use these button to start/stop the selected PRU. If PRU is already running, on starting simppru-console, it is automatically stopped. -|image1| +.. image:: images/stop_screen.png + :width: 598 + :align: center + :height: 400 + :alt: Start/stop buttons Send message to PRU ~~~~~~~~~~~~~~~~~~~ @@ -32,7 +39,11 @@ supported. On pressing enter, the typed message is sent. PRU0 is running echo program, whatever is sent is echoed back. -|image2| +.. image:: images/send_screen.png + :width: 598 + :align: center + :height: 400 + :alt: Start/stop buttons Receive message from PRU ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -42,26 +53,30 @@ using a for loop, which checks if new message is arrived every 10 ms. - PRU is running echo program, whatever is sent is echoed back. - |image3| |image4| +.. image:: images/receive_screen_2.png + :width: 598 + :align: center + :height: 400 + :alt: Echoing program - PRU is running countup program, it sends a increasing count every 1 second, which starts from 0 - |image5| |image6| +.. image:: images/receive_counter_2.png + :width: 598 + :align: center + :height: 400 + :alt: Echoing program -Change PRU id +Change PRU ID ~~~~~~~~~~~~~ Using the radio box in the upper right corner, one can change the PRU id, i.e. if one wants to use the features for PRU0 or PRU1 -|image7| +.. image:: images/select_pru_id_screen.png + :width: 598 + :align: center + :height: 400 + :alt: Change the PRU ID -.. |image0| image:: images/main_screen.png -.. |image1| image:: images/stop_screen.png -.. |image2| image:: images/send_screen.png -.. |image3| image:: images/receive_screen.png -.. |image4| image:: images/receive_screen_2.png -.. |image5| image:: images/receive_counter.png -.. |image6| image:: images/receive_counter_2.png -.. |image7| image:: images/select_pru_id_screen.png diff --git a/simppru/usage-simppru.rst b/simppru/usage-simppru.rst index f9ca57ca..0d8fcf18 100644 --- a/simppru/usage-simppru.rst +++ b/simppru/usage-simppru.rst @@ -1,4 +1,4 @@ -Usage +Usage(simppru) ===== .. code:: bash -- GitLab