嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 }6 y. w t; v% a' u& r/ M8 V
6 V0 \; E# t0 [2 R& J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& ^9 {! b, B5 l% w" U J
#include <unistd.h>
2 I1 a1 m0 |" ^
#include <sys/mman.h>
* s& p+ m& H" b" A f6 N& r
#include <sys/types.h>
' ^) a3 |! j! |9 c* A$ U
#include <fcntl.h>
# X8 |$ n( G6 f% \1 s2 P8 w
) k0 a, J3 `( n/ `4 H
#define SHAER_RAM_BASE_ADDR (0x80000000)
~! ^ B X" R, N8 @
, d" @- a4 w @. C+ s# o
typedef struct
/ }# O2 M) Z9 P. a, w7 E6 y" A* [
{
. L8 {( i3 ^0 b/ |, s
unsigned int a;
( Z' e# O) z& `+ N& G, Y
unsigned int b;
7 @' h* g' w C$ i% p
unsigned int packet_cout;
: p! @ e. h" P/ y. y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; I3 p4 Q( a! \6 U7 v4 @8 J
b4 |3 w2 g! Y9 n/ n0 ~# Q) J8 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ K6 ? H4 @) e* o2 v) h
unsigned int count_copy = 0;
; F1 _" _- y3 U( \
# t, v, J- D9 [
& I; l+ A: b0 t& x7 r/ S" S0 W9 N
int main()
+ v$ q& b- N: m% E: Q& t, @
{
$ U' t( b, P9 Z6 v
pRX_MSG_PROTOCOL pshreRAM = NULL;
v8 ~2 y+ y' K' |0 g: Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! K, e1 X, M0 r5 V" ^
' Q' ~! g" r% b
while(1)
) D! `. P" J( n5 Q" H1 L5 @! t
{
6 f4 U) O- F) b; }/ ~
read_MSG_buffer(pshreRAM);
m! C1 L. T8 F+ {% U! U/ x
}
! s+ w1 H8 ]' N* H
}
3 c+ n7 y9 P- S7 e$ u' E, |% V
. z1 `' G- A; J$ q) z% k! b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; k$ a, \% Z9 V
{
! J- U. L5 o0 R, O; ?' j$ `
RX_MSG_PROTOCOL buf;
" c' l+ S5 k3 E& g4 y
0 A3 M8 y, T P
buf.a = pshreRAM->a;
3 O3 o5 A% b, |" L
buf.b = pshreRAM->b;
5 R0 _! Q& W9 V; x8 |/ C
buf.packet_cout = pshreRAM->packet_cout;
0 H) q; o Q3 l! l
8 ~/ X2 L1 K1 C1 ^' X, V! l( A- a
if(buf.packet_cout != count_copy)
! n/ F( t0 X! x
{
/ J: S# M. b8 h( a' \; z
printf("a is %d\n", buf.a);
) r& F; B! M4 R1 O
printf("b is %d\n", buf.b);
w3 u8 v. g* H5 x, h2 ?6 c
printf("count is %d\n", buf.packet_cout);
" B0 e, i# {7 v/ v; v7 m
count_copy = buf.packet_cout;
* Q5 }8 |8 W- l1 B s; S5 F, J2 r
}
' d$ c3 y6 g9 b: g
else
8 {9 x: P# h! i; | [" p: z
{
6 a+ X( H) }6 [4 T0 T' O4 p
printf("No effective message!");
; G3 O+ ?1 B: v2 |3 k0 q) n
}
7 a+ I( K8 ^8 ~+ N$ y
}
* [3 k- s/ F/ r
, {$ `% D3 O% Y8 B4 I
$ ?, [, b2 w+ g9 l7 n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 S @7 s" z h8 l6 ~
使用下面代码,对内存使用了mmap函数后:
@9 w; d Z% S- D( f* v5 h
#include <stdio.h>
/ |1 ]4 n. W: d4 }
#include <unistd.h>
" c1 m8 u3 }: r' k
#include <sys/mman.h>
# h! D! l/ b/ m8 H4 o$ o
#include <sys/types.h>
. y y) ^; w* J& v+ d
#include <fcntl.h>
# p- K. n- @- ?* J, m4 q
' I, ]5 m# V/ i4 C* M4 j4 y# t- E% M
#define SHAER_RAM_BASE_ADDR (0x80000000)
# j4 @; V( ?- V' P" a3 P, i5 J
#define SHAER_RAM_SIZE (0x20000)
# Q6 S" k% x6 n8 E
O5 N& F% [( M/ Q9 N/ W
typedef struct
7 S; \' K( u% ^' y% n# j- h
{
# _6 f! Q n* e
unsigned int a;
8 h( w7 p2 S# e% x+ V) y% G4 q; m
unsigned int b;
" T3 B0 R) b# ~0 E
unsigned int packet_cout;
6 ]- @( q! L0 A0 h3 f. K1 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ~7 b# ]9 K0 u1 u& e
1 z; p' O$ o" O& D8 Y1 |
void read_MSG_buffer(int *baseaddr);
$ \1 \/ j: y- K0 G9 E/ L' F
unsigned int count_copy = 0;
4 n: ^$ w$ D& x( E3 s
2 `) ?# s4 l# F
int main()
3 Q( y2 b& l! v
{
- L" m& u, b3 x% ?0 }- d4 b
int fd;
$ S. d/ ^8 p; W
int *mem = NULL;
$ P; |( Z/ J4 _
3 G& f W$ J; I% G4 E! ]
if((fd = open("/dev/mem", O_RDWR)) <0)
; Y$ a; v" W0 M* J0 B6 j& [5 t
{
' {. U1 X3 M: ? d1 Z' Y1 M
perror("open error");
, s. m* k0 _. e) i& q7 Q
return -1;
s- H3 R9 \# D3 c6 I4 j
}
( y: l; o( c4 K0 z# l e' H% u
) `7 U) f; I$ X
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
@* w0 B7 x6 R0 t" v" L
7 O# }# n/ E9 |! p
while(1)
+ p/ i+ p0 k! H, a
{
& s( F. E. g" Q$ V9 k3 V
read_MSG_buffer(mem);
/ ]8 G5 l' O2 p1 I- c* Y1 g
}
9 B2 ~ u+ e8 B. X3 Q4 ]
}
6 _* x& s; W" x' ]4 i. T
; D q+ a6 y0 ]* b* e2 |* G7 t" b
void read_MSG_buffer(int *baseaddr)
' f, B G1 l+ w) D# D3 Z
{
5 J i4 K1 X. f7 @" @9 M0 H4 z( G
pRX_MSG_PROTOCOL pshreRAM = NULL;
* G1 l8 T1 }+ O! J# }
, B- ^9 v3 t4 ` J3 ?3 _# G/ V1 U$ S( N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; g# B, Q7 L' z Y' R4 [
& a+ }& [6 D+ d* a8 @% P0 A
if(pshreRAM->packet_cout != count_copy)
3 F0 R0 ]) G8 z7 J9 H
{
3 m I" U$ {$ M3 w0 B
printf("a is %d\n", pshreRAM->a);
E# M! L1 b# m* |+ q+ Z) {
printf("b is %d\n", pshreRAM->b);
8 J: V- M& E2 P! q% p0 h
printf("count is %d\n", pshreRAM->packet_cout);
" l/ E- c" {9 Z% ~: B9 _
count_copy = pshreRAM->packet_cout;
2 h& e: {6 @6 ?+ l c" s
}
0 i! Q# s" h( G: k8 L* {, [- [" f
else
- F$ k( s1 l; G& j2 G4 e* e+ A" L r
{
; a4 h2 c) @- i
printf("No effective message!\n");
X* ^2 n' r* s( M& ?$ r# ~) p
}
: R" Y! {1 \* p+ ]$ W5 H
}
. m5 a4 H1 b9 z6 M |
7 t7 `0 _( P, z$ L/ F; w1 r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
[9 ^3 a" L7 E: u( {4 A8 l- L
2 P. k/ A' I7 \/ C c# z
- ?. ?! _5 Z- T9 N
# v5 n6 N6 m+ g3 Z: B2 m0 R+ A* P
" B+ ^* {: r6 ^" s" A! P y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4