Доступ к общей памяти между PRU и гончей костью - PullRequest
0 голосов
/ 22 ноября 2018

Мне нужна ваша помощь

У меня возникли проблемы с доступом к общим регистрам PRU на стороне Beaglebone.

Итак, я пишу в нужные адреса памяти на стороне PRU (я могу проверить это с помощью инструмента prudebug, предоставленного здесь: https://markayoder.github.io/PRUCookbook/, который я могу использовать для проверки содержимогоПРУ регистрируется).Но проблема возникает, когда я пытаюсь получить к нему доступ со стороны руки: в Pru я записал значение 0xED в регистры 0x10000, однако со стороны руки я не могу его прочитать.

Я думаю, что мне нужно использовать функцию mmap ядра, чтобы получить доступ к адресам физической памяти, но, возможно, я что-то неправильно делал при использовании самой функции.Может ли кто-нибудь пролить свет на то, что здесь происходит?

Сторона PRU:

#include <stdint.h>
#include <pru_cfg.h>
#include "resource_table_empty.h"

#define PRU_SHARED_MEM_ADDR 0x00010000

void main(void)
{
    // enable OCP
    CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
    volatile int* buffer = (volatile int *) PRU_SHARED_MEM_ADDR;
    buffer[0] = 0xED;
    /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port->Shared memory */
    CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
}

Сторона плеча:

#include <sys/mman.h>

#define DDR_BASEADDR   0x10000
#define OFFSET_DDR     0x00

int main(int argc, char **argv)
{
   int mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
   if (mem_fd == -1){
        printf("Err");
        return 0;
   }
   volatile void *ddrMapp = NULL;
   volatile void *DDR_regaddr1 = NULL;

   ddrMapp = mmap(0, 0x0FFFFFFF, PROT_WRITE | PROT_READ, MAP_SHARED, mem_fd, DDR_BASEADDR);

   DDR_regaddr1 = ddrMapp + OFFSET_DDR;
   printf("PRU address: %X\n", &DDR_regaddr1); // returns 0xBEFFFB00
   return(0);
 }

ps: Вот документация по функции mmap: http://man7.org/linux/man-pages/man2/mmap.2.html

1 Ответ

0 голосов
/ 06 февраля 2019

В зависимости от версии вашего ядра, я бы предложил использовать PRU Linux Application Loader :

http://processors.wiki.ti.com/index.php/PRU_Linux_Application_Loader_API_Guide

, чтобы вы могли

    /* Get pointers to PRU local memory */
    void *pruDataMem;
    prussdrv_map_prumem(PRUSS0_PRU0_DATARAM, &pruDataMem);
    unsigned int *pruData = (unsigned int *) pruDataMem;

и доступ к данным в ОЗУ PRU как pruData [0] и т. Д.

...