Difference between revisions of "BeagleBone PRU Notes"
m (Added a link to some work PRU examples) |
m (→Leads: Added notes on the element14 instructions.) |
||
Line 69: | Line 69: | ||
Here's some sources of information. | Here's some sources of information. | ||
− | * [http://www.element14.com/community/community/knode/single-board_computers/next-gen_beaglebone/blog/2013/05/22/bbb--working-with-the-pru-icssprussv2 BBB - Working with the PRU-ICSS/PRUSSv2] Has very detailed instructions for working with the Black. | + | * [http://www.element14.com/community/community/knode/single-board_computers/next-gen_beaglebone/blog/2013/05/22/bbb--working-with-the-pru-icssprussv2 BBB - Working with the PRU-ICSS/PRUSSv2] Has very detailed instructions for working with the Black. In Step 2, rather than searching for '''am335x_pru_package-master.zip''' just do a |
+ | beagle$ '''git clone git@github.com:beagleboard/am335x_pru_package.git''' | ||
+ | I had to | ||
+ | beagle$ '''cd am335x_pru_package/pru_sw/utils''' | ||
+ | beagle$ '''mv pasm pasm_2''' | ||
+ | before I could '''make''' the examples. | ||
+ | |||
* [http://git.mah.priv.at/gitweb?p=emc2-dev.git;a=shortlog;h=refs/heads/arm335x-hal-pru-tasks Working PRU examples] | * [http://git.mah.priv.at/gitweb?p=emc2-dev.git;a=shortlog;h=refs/heads/arm335x-hal-pru-tasks Working PRU examples] |
Revision as of 11:51, 1 August 2013
The goal of this page is to record information that is pertinent to getting started with the BeagleBone's AM335x Programmable Real-time Unit (PRU).
Contents
BeagleBone Programmable Real-time Unit
This is also called the PRU Subsystem (PRUSS) or PRU and Industrial Controller Subsystem (PRU-ICSS). It is optimized to perform embedded tasks that require real-time constraints.
Most important is the purssdrv library to expose functions to the PRU. You can load this library by typing modprobe uio_pruss.
PRU capabilities
- The PRU has dual 32-bit RISC cores, shared data and instruction memories and an interrupt controller (INTC).
- 8KB data memory and 8KB instruction memory
- 12KB shared RAM
- A small, deterministic instruction set
There is no pipelining done on the processor and there are 29 (r1-r30) registers to use.
Data Sheet is located at http://www.ti.com/lit/pdf/spruh73
Software examples
BeagleBoard/TI has provided example C programs that utilize the PRU on github.
These include: PRU_memAccess_DDR_PRUsharedRAM, PRU_memAccessPRUDataRam, PRU_PRUtoPRUInterrupt, and a PRU assembler.
Full assembly guide is located at http://processors.wiki.ti.com/index.php/PRU_Assembly_Reference_Guide
Instruction Set
Nearly all instructions (with exception of accessing memory external to PRU) are single-cycle execute (5 ns when running at 200 MHz)
Four instruction classes
- Arithmetic
- Logical
- Flow Control
- Register Load/Store
Instruction Syntax
- Mnemonic, followed by comma separated parameter list
- Parameters can be a register, label, immediate value, or constant table entry
- Example
- SUB r3, r3, 10
- Subtracts immediate value 10 (decimal) from the value in r3 and then places the result in r3
Example Assembly
;INTC_SIR_IRQ/INTC_SIR_FIQ register address INTC_SIR_IRQ_ADDR/INTC_SIR_FIQ_ADDR .word 0x48200040/0x48200044 ; ACTIVEIRQ bit field mask to get only the bit field ACTIVEIRQ_MASK .equ 0x7F _IRQ_ISR/_FIQ_ISR: ; Save the critical context STMFD SP!, {R0-R12, LR} ; Save working registers and the Link register MRS R11, SPSR ; Save the SPSR into R11 ; Get the number of the highest priority active IRQ/FIQ LDR R10, INTC_SIR_IRQ_ADDR/INTC_SIR_FIQ_ADDR LDR R10, [R10] ; Get the INTC_SIR_IRQ/INTC_SIR_FIQ register AND R10, R10, #ACTIVEIRQ_MASK ; Apply the mask to get the active IRQ number ; Jump to relevant subroutine handler LDR PC, [PC, R10, lsl #2] ; PC base address points this instruction + 8 NOP ; To index the table by the PC ; Table of handler start addresses .word IRQ0handler ;For IRQ0 of BANK0 .word IRQ1handler .word IRQ2handler
Leads
Here's some sources of information.
- BBB - Working with the PRU-ICSS/PRUSSv2 Has very detailed instructions for working with the Black. In Step 2, rather than searching for am335x_pru_package-master.zip just do a
beagle$ git clone git@github.com:beagleboard/am335x_pru_package.git
I had to
beagle$ cd am335x_pru_package/pru_sw/utils beagle$ mv pasm pasm_2
before I could make the examples.