Skip to content
Snippets Groups Projects
Commit fdd11425 authored by 488_MP-4's avatar 488_MP-4
Browse files

working on shared mem buffer

parent 58c1d2e9
No related branches found
No related tags found
3 merge requests!109Final sdmay24-32 merge to master,!104adding cflib to this branch,!101adding baremetal programs
#include<stdio.h>
#include<stddef.h>
#include<sys/mman.h>
#include<fcntl.h>
#define SHMADDR 0x3F000000
int main(int argc, char *argv[])
{
int fd;
int * memaddr;
fd = open("/dev/mem", O_RDWR);
if (fd == -1)
{
printf("can not access /dev/mem\n" );
return -1;
}
memaddr =
(int*)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, SHMADDR);
if (memaddr == MAP_FAILED)
{
printf("mmap failed\n" );
return -1;
}
printf("value=%d\n", *memaddr);
}
\ No newline at end of file
#include "memory.h"
char* map_shared_mem()
{
int fd;
char *memaddr;
fd = open("/dev/mem", O_RDWR);
if (fd == -1)
{
printf("can not access /dev/mem\n" );
return NULL;
}
memaddr =
(char *)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, SHMADDR);
if (memaddr == MAP_FAILED)
{
printf("mmap failed\n" );
return NULL;
}
return memaddr;
}
int write_shared_mem(char* memaddr, packet_t packet)
{
*memaddr = 0xFF;
memcpy(*(memaddr + 1), packet.data, packet.len);
return 0;
}
int shared_mem_loop(queue_t* queue)
{
}
\ No newline at end of file
#ifndef MEMORY_H
#define MEMORY_H
#include<stdio.h>
#include<stddef.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<string.h>
#include<stdint.h>
#include "queue.h"
#define SHMADDR 0x3F000000
#endif
\ No newline at end of file
#ifndef PACKET_H
#define PACKET_H
#include<stddef.h>
typedef struct packet {
size_t len;
char * data;
} packet_t;
#endif
\ No newline at end of file
#include "queue.h"
/*
Author: Justin Kenny
Creates a queue to hold packets for shared memory based on a linked list
*/
//Initializes the queue.s
void queue_init(queue_t *queue)
{
queue->head = NULL;
queue->tail = NULL;
queue->size = 0;
}
//Returns a pointer to the new queue node. If it return null, then malloc failed.
queue_node_t* enqueue(queue_t *queue, packet_t* packet)
{
queue_node_t *n;
n = malloc(sizeof(*n));
if(n)
{
n->data = packet;
if(queue->head)
{
queue->tail->next = n;
n->prev = queue->tail;
queue->tail = n;
}
else
{
//the queue is empty
queue->head = queue->tail = n;
}
queue->size++;
}
return n;
}
packet_t* dequeue(queue_t *queue)
{
queue_node_t *n;
if(!queue->head)
{
return NULL;
}
if(queue->head == queue->tail)
{
n = queue->head;
queue->head = queue->tail = NULL;
}
else
{
queue_node_t *next;
next = queue->head->next;
n = queue->head;
next->prev = NULL;
queue->head = next;
}
packet_t *packet = n->data;
free(n);
return packet;
}
\ No newline at end of file
#ifndef QUEUE_H
#define QUEUE_H
#include "packet.h"
#include <stdlib.h>
typedef struct queue_node {
struct queue_node *next;
struct queue_node *prev;
packet_t *data;
} queue_node_t;
typedef struct queue {
queue_node_t *head;
queue_node_t *tail;
int size;
} queue_t;
void queue_init(queue_t *queue);
queue_node_t* enqueue(queue_t *queue, packet_t* packet);
packet_t* dequeue(queue_t *queue);
#endif
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment