Placing integer arrays in PRU Shared memory

I’m on a BBB Wireless running

Linux beaglebone 4.19.94-ti-r61 #1buster SMP PREEMPT Wed Mar 31 15:23:20 UTC 2021 armv7l GNU/Linux

The version.sh output is at the end of this post.

I need to put readings from two analog inputs into two arrays so I can do some calculations on them. Basically, when one of the inputs exceeds a threshold, I’ll do these calculations on the values in the arrays. Essentially these will be two ring buffers.
I don’t have a lot of variables or a lot of code really but it doesn’t take much to overflow the default stack and heap or 8k of RAM local to each PRU. So, I’m thinking the solution is to force these two arrays into the 12k shared RAM since I’m only using PRU0 in this application.

I’ve been trying to follow Molloy’s example and Mark Yoder’s PRUCookbook example but when I compile the PRU code it freezes the whole system which I suspect is because of a stack or heap overflow.

Here are the code snippets. What am I doing wrong and/or what could I do differently?

#define SHARE_MEM 0x00010000

// declaring int arrays to go in PRU Shared memory space

#define E_RING_BUFFER_SIZE 5 // each array will have 5 elements; ultimately need 50 each

volatile unsigned int *DetTSampleSet = (unsigned int *) SHARE_MEM;
volatile unsigned int *DetBSampleSet = (unsigned int *) (SHARE_MEM + (E_RING_BUFFER_SIZE * sizeof(unsigned int))); ;

.
.
.
.
// putting data from analog sensor read into array element

Data = HWREG(SOC_ADC_TSC_0_REGS + TSC_ADC_SS_FIFODATA(0));
StepRead = (Data >> 16) & 0xF;
RawAnalog = Data & 0xFFF;

switch (StepRead)
{
case 0:
DetTSample = RawAnalog;
//DetTSampleSet[pnr]=RawAnalog;
break;
case 1:
DetBSample = RawAnalog;
DetBSampleSet[0]=RawAnalog;

.
.
.
.

debian@beaglebone:/var/lib/cloud9$ sudo /opt/scripts/tools/version.sh
git:/opt/scripts/:[b39ec679648a6be8f25f48bd1c9784c1fc5a0c46]
eeprom:[A335BNLTBWA52027BBWG0227]
model:[TI_AM335x_BeagleBone_Black_Wireless]
dogtag:[BeagleBoard.org Debian Buster IoT Image 2020-04-06]
bootloader:[microSD-(push-button)]:[/dev/mmcblk0]:[U-Boot 2019.04-00002-g07d5700e21]:[location: dd MBR]
bootloader:[eMMC-(default)]:[/dev/mmcblk1]:[U-Boot 2018.03-00002-gac9cce7c6a]:[location: dd MBR]
UBOOT: Booted Device-Tree:[am335x-boneblack-uboot-univ.dts]
UBOOT: Loaded Overlay:[AM335X-PRU-RPROC-4-19-TI-00A0]
UBOOT: Loaded Overlay:[BB-ADC-00A0]
UBOOT: Loaded Overlay:[BB-BBBW-WL1835-00A0]
UBOOT: Loaded Overlay:[BB-BONE-eMMC1-01-00A0]
UBOOT: Loaded Overlay:[BB-I2C2-RTC-DS3231]
UBOOT: Loaded Overlay:[BB-W1-P9.12-00A2]
kernel:[4.19.94-ti-r61]
nodejs:[v10.15.2]
/boot/uEnv.txt Settings:
debian@beaglebone:/var/lib/cloud9$ sudo /opt/scripts/tools/version.sh
[sudo] password for debian:
git:/opt/scripts/:[b39ec679648a6be8f25f48bd1c9784c1fc5a0c46]
eeprom:[A335BNLTBWA52027BBWG0227]
model:[TI_AM335x_BeagleBone_Black_Wireless]
dogtag:[BeagleBoard.org Debian Buster IoT Image 2020-04-06]
bootloader:[microSD-(push-button)]:[/dev/mmcblk0]:[U-Boot 2019.04-00002-g07d5700e21]:[location: dd MBR]
bootloader:[eMMC-(default)]:[/dev/mmcblk1]:[U-Boot 2018.03-00002-gac9cce7c6a]:[location: dd MBR]
UBOOT: Booted Device-Tree:[am335x-boneblack-uboot-univ.dts]
UBOOT: Loaded Overlay:[AM335X-PRU-RPROC-4-19-TI-00A0]
UBOOT: Loaded Overlay:[BB-ADC-00A0]
UBOOT: Loaded Overlay:[BB-BBBW-WL1835-00A0]
UBOOT: Loaded Overlay:[BB-BONE-eMMC1-01-00A0]
UBOOT: Loaded Overlay:[BB-I2C2-RTC-DS3231]
UBOOT: Loaded Overlay:[BB-W1-P9.12-00A2]
kernel:[4.19.94-ti-r61]
nodejs:[v10.15.2]
/boot/uEnv.txt Settings:
uboot_overlay_options:[enable_uboot_overlays=1]
uboot_overlay_options:[uboot_overlay_addr4=/lib/firmware/BB-W1-P9.12-00A0.dtbo]
uboot_overlay_options:[disable_uboot_overlay_video=1]
uboot_overlay_options:[disable_uboot_overlay_audio=1]
uboot_overlay_options:[uboot_overlay_pru=/lib/firmware/AM335X-PRU-RPROC-4-19-TI-00A0.dtbo]
uboot_overlay_options:[enable_uboot_cape_universal=1]
uboot_overlay_options:[dtb_overlay=/lib/firmware/BB-I2C2-RTC-DS3231.dtbo]
pkg check: to individually upgrade run: [sudo apt install --only-upgrade ]
pkg:[bb-cape-overlays]:[4.14.20210401.0-0~buster+20210401]
pkg:[bb-wl18xx-firmware]:[1.20200322.0-0rcnee0~buster+20200322]
pkg:[kmod]:[26-1]
pkg:[librobotcontrol]:[1.0.4-git20190227.1-0rcnee0~buster+20190327]
pkg:[firmware-ti-connectivity]:[20190717-2rcnee1~buster+20200305]
groups:[debian : debian adm kmem dialout cdrom floppy audio dip video plugdev users systemd-journal bluetooth netdev i2c gpio pwm eqep remoteproc admin spi iio docker tisdk weston-launch xenomai cloud9ide]
cmdline:[console=ttyO0,115200n8 bone_capemgr.uboot_capemgr_enabled=1 root=/dev/mmcblk0p1 ro rootfstype=ext4 rootwait coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet]
dmesg | grep remote
[ 69.919456] remoteproc remoteproc0: wkup_m3 is available
[ 70.232036] remoteproc remoteproc0: powering up wkup_m3
[ 70.232072] remoteproc remoteproc0: Booting fw image am335x-pm-firmware.elf, size 217148
[ 70.232362] remoteproc remoteproc0: remote processor wkup_m3 is now up
[ 72.486601] remoteproc remoteproc1: 4a334000.pru is available
[ 72.507930] remoteproc remoteproc2: 4a338000.pru is available
dmesg | grep pru
[ 72.486601] remoteproc remoteproc1: 4a334000.pru is available
[ 72.486792] pru-rproc 4a334000.pru: PRU rproc node pru@4a334000 probed successfully
[ 72.507930] remoteproc remoteproc2: 4a338000.pru is available
[ 72.508098] pru-rproc 4a338000.pru: PRU rproc node pru@4a338000 probed successfully
dmesg | grep pinctrl-single
[ 0.951056] pinctrl-single 44e10800.pinmux: 142 pins, size 568
dmesg | grep gpio-of-helper
[ 0.964776] gpio-of-helper ocp:cape-universal: ready
lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
END

Hi Walter,

I’m on the cellphone and that is a little hard to read your code? But I did find the offset of the pru memory , because you need allocate the memory inside the pru memory address and you is allocating at the 1000 address

Vinicius…

Thanks for looking from your phone!

Are you saying that SHARE_MEM is incorrect? I took that directly from Molloy’s examples in Exploring BeagleBone.

Maybe it looks incorrect on your phone?

Walter

Sorry my mistake,

Your code is running inside the pru right?
I was mistaking with host manipulating pru shared memory - in this case there is an offset on the host side.
I
You are mentioning when run your code is freezing, could you try to decrease the memory to try some kind of debug(pru debug+ dmesg) to try understand what is happening? Maybe 1 byte so see if it’s freezing ?

You could follow experienced councelors. A month ago I told you that libpruio provides that ADC ring buffer.

Remoteproc is working fine in our application. I made a stupid mistake that was causing my problem. It’s fixed and working fine now. I’m sure it won’t be the last issue I have because I’m human and I make mistakes.

My stupid mistake was that I had declared another variable in the same exact space at one point and had forgotten to remove that declaration. It was causing a conflict.