I've been pulling my hair out over a really weird problem and after trying 
everything I know to try, I'm posting it here in hopes of someone seeing 
the problem.

 I am running a Beaglebone Black.  The output of version.sh is at the end 
of this post.

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

I boot from an SD card.

I'm using remoteproc to communicate between a host program and the PRU code.

The program is long and includes stuff that I don't think is important here 
like configured the ADC and IEP counter.

 

The host program lets the user choose from a menu what they want the PRU to 
do.  Then using RPMSG, the command is sent to the PRU.  It receives the 
message, determines what it is and executes the appropriate action in the 
PRU code.  This is done by reading the message and using an "if-else 
if-else".  One of the actions is to read three analog inputs and return the 
values read through RPMSG.   Each analog value is stored in a ring 
buffer-type array, type unsigned int, that is allocated in the PRU Shared 
memory space.   

 

So once the host sends the message to do the analog input read, it starts 
to listen for responses from the PRU.

 

This all works great.  I get data from the PRU and the host program puts it 
in a CSV file that I can analyze with other tools.  

Now, though we need to do some basic math on the data in the PRU.  I only 
need to do this on a subset of the data in the arrays and the start and end 
points in the array can vary.  So I have two integer variables that I use 
to store the start and end points.     So, the routine that reads the 
analog data sets the values of these two variables as voltage thresholds 
are met.  The code compiles just fine.

 

However, if these two variables are not set to a constant within the loop, 
the host never gets a message from the PRU code.  They are set to initial 
values before the loop (that code is not included below.) 

It's the craziest thing I've ever run into I think.   I have declared these 
variables as local and global and nothing seems to matter.  If they are set 
to a constant in the loop, the host doesn't get a message from the PRU 
program. 

 

Here's the code snippet with the two variables in bold.  If those lines of 
code do not exist, the host doesn't hear from the PRU.

 

count = HWREG(SOC_ADC_TSC_0_REGS + TSC_ADC_SS_FIFOCOUNT(0));

 

for (i = 0; i < count; i++) 

{

Data = HWREG(SOC_ADC_TSC_0_REGS + TSC_ADC_SS_FIFODATA(0));

StepRead = (Data >> 16) & 0xF;

RawAnalog = Data & 0xFFF;

 

switch (StepRead)

{

case 0:

 

DetTSampleSet[pnr]=RawAnalog;

break;

case 1:

                                      

*start_of_pulse = 0;*

*end_of_pulse = 0;*

 

DetBSampleSet[pnr]=RawAnalog;

if ((pnr == end_of_pulse) && (in_pulse == E_YES)) // seen a pulse and at 
end of it analyze signal

{

DetBSignalAverage= AnalyzeSignal(start_of_pulse, pnr);

start_of_pulse = -1;

end_of_pulse = -1;

samples_in_pulse = 0;

in_pulse = E_NO;

}

else

{

DetBSignalAverage = 0;

}

if (RawAnalog > 0xB54)

{

__R30 |= PanelYellowLED; // turn yellow LED on; at the sampling rate we're 
using this may result in just a flicker

in_pulse = E_YES; // once the leading edge of the pulse passes set this

samples_in_pulse++; // count the number of samples in the pulse

DetBSignalAverage = 999; // samples_in_pulse;//just using for debugging

//

// here we will check for a max # of samples in pulse while in a pulse to 
throw out start of fluid or end of fluid or pulses larger than a seed

//

if (start_of_pulse < 0) start_of_pulse = pnr;  // set start pointer in ring 
buffer if it hasn't already been set for this pulse

}

else if ((RawAnalog <= 0xAC8) && (in_pulse == E_YES))

{

__R30 &= ~CAValve;  // turn compressed air off; stop fluid flow because the 
pulse has cleared the bottom detector

in_pulse = E_NO; // pulse is over

DetBSignalAverage = 1999; //samples_in_pulse;//just using for debugging

//

// this is an alternative place to check the number of samples in the pulse 
to throw out start / end of fluid but we would never stop because Rawanalog

// will never drop while there is no fluid in the tube

//

if (end_of_pulse < 0) end_of_pulse = pnr;  // capture where we are in the 
ring buffer at the end of the pulse

 

__R30 |= VacValve; // turn vacuum on to hold fluid in place; ultimately 
this would read the pressure and attempt to hold it there

__delay_cycles(40000000);  // put this delay cycle here for now.  will be 
replaced with a routine to analyze pulse & maintain slight vacuum later

__R30 &= ~VacValve;

__delay_cycles(40000000);  // put this delay cycle here for now.  will be 
replaced with a routine to analyze pulse later

__R30 |= CAValve;

}

else        __R30 &= ~PanelYellowLED; // turn yellow LED off

 

StepRead = RawAnalog;

RawAnalog = DetBSignalAverage;

break;

case 2:

Pressure  = RawAnalog;

if (pnr == E_RING_BUFFER_SIZE-1)

{

pnr = 0;

}

else

{

pnr++;

}

RawAnalog=pnr;

break;

default:  // flash both LEDS indicating a problem

for (i=0;i<20;i++)

{

__R30 |= PanelGreenLED; // turn green LED on

__delay_cycles(10000000);

__R30 |= PanelYellowLED; // turn green LED on

__delay_cycles(20000000);

__R30 &= ~PanelGreenLED; // turn green LED off

__delay_cycles(30000000);

__R30 &= ~PanelYellowLED; // turn yellow LED off

__delay_cycles(40000000);

}

break;

 

}

 

 

git:/opt/scripts/:[b39ec679648a6be8f25f48bd1c9784c1fc5a0c46]

eeprom:[A335BNLT00C04417BBBK1847]

model:[TI_AM335x_BeagleBone_Black]

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-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>]

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

[   70.424168] remoteproc remoteproc0: wkup_m3 is available

[   70.537289] remoteproc remoteproc0: powering up wkup_m3

[   70.537322] remoteproc remoteproc0: Booting fw image 
am335x-pm-firmware.elf, size 217148

[   70.537592] remoteproc remoteproc0: remote processor wkup_m3 is now up

[   72.807404] remoteproc remoteproc1: 4a334000.pru is available

[   72.825531] remoteproc remoteproc2: 4a338000.pru is available

dmesg | grep pru

[   72.807404] remoteproc remoteproc1: 4a334000.pru is available

[   72.811832] pru-rproc 4a334000.pru: PRU rproc node pru@4a334000 probed 
successfully

[   72.825531] remoteproc remoteproc2: 4a338000.pru is available

[   72.825738] pru-rproc 4a338000.pru: PRU rproc node pru@4a338000 probed 
successfully

dmesg | grep pinctrl-single

[    0.951001] pinctrl-single 44e10800.pinmux: 142 pins, size 568

dmesg | grep gpio-of-helper

[    0.964886] gpio-of-helper ocp:cape-universal: ready

lsusb

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

END

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/bdc3a00b-94de-4e11-8573-f83b0b1cdcfan%40googlegroups.com.

Reply via email to