嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# \- m6 v/ X$ M7 l; y
5 W5 X* V4 V2 q+ s/ F0 G7 H7 {) y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 P$ m( l- ?/ A9 S0 J/ v3 Y# ]
#include <unistd.h>
p6 Q. l6 `3 X/ Y$ I1 Z
#include <sys/mman.h>
4 h7 O# p3 ]/ A
#include <sys/types.h>
5 s, Q. s: u- w
#include <fcntl.h>
* s+ R$ k9 P6 R+ k* ?9 q
$ e* s% U+ X2 D! K8 {
#define SHAER_RAM_BASE_ADDR (0x80000000)
' V6 C" |- O z& d
, l; k0 H3 P: q9 i+ D
typedef struct
0 Z t: u, F6 f# J; D Z
{
0 ]3 y* M% R% v6 u2 i% J9 R
unsigned int a;
% _" A: F. C6 T3 `6 j1 R
unsigned int b;
z2 x2 _4 C4 J: F, H) h/ ~% h
unsigned int packet_cout;
z; M# ]( \6 i( e8 X; I) `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! A! n$ ~: i: t
2 R& H! a% S/ ]. a, D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ y. l8 Q q9 \7 A& V* c& f
unsigned int count_copy = 0;
1 `! A. m6 u( I& c" e. |
2 F5 H( Z" ?0 P3 D& G* ]3 X
' x: s, n: v1 |' T5 G
int main()
# }0 w8 ?9 e0 ?7 u" ]. [
{
U# F4 D. k0 g6 t/ H
pRX_MSG_PROTOCOL pshreRAM = NULL;
' t1 ]! f9 b6 r3 R; L
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 t! B6 M3 l. q2 U- C4 N! |( a# M
( h, \0 r* v' f
while(1)
# x1 z8 v5 O) C: l
{
! R" @ g+ D, v; W
read_MSG_buffer(pshreRAM);
7 Q8 l; ~5 S9 a0 e4 R8 U' g
}
4 N `* z( ~1 M$ i
}
0 e) T# K0 o8 z9 B
9 i0 w( W, |0 ~, F4 r, o2 J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, S5 ]% K* r1 C( ]
{
$ C7 h$ G" j, E3 s' |8 ^3 S
RX_MSG_PROTOCOL buf;
3 N# N! P: d$ A4 j" l
) |6 K3 M6 G% q9 n6 m
buf.a = pshreRAM->a;
: Z! R) e# p6 b
buf.b = pshreRAM->b;
5 K3 ~9 R! v4 f* h2 s" [
buf.packet_cout = pshreRAM->packet_cout;
" u: S& k! f- ^& g2 O' E
. z- f9 |" l! n8 {% `# H
if(buf.packet_cout != count_copy)
1 _% }3 E# U3 d8 t$ u' S+ o) Y6 \
{
% i$ @; O8 n3 {# n% l7 ]
printf("a is %d\n", buf.a);
& T# H5 ~8 v6 f5 V: g
printf("b is %d\n", buf.b);
7 _8 o( C$ j) h) H W' X# L8 v
printf("count is %d\n", buf.packet_cout);
$ [3 Z) A% |4 K1 k* ?" N
count_copy = buf.packet_cout;
& Z6 \5 c6 L5 c8 @& S. r( }
}
9 D# `) t. o1 v* G
else
! ^ z2 Q) [, j
{
- o( ~) W" P) S/ K! ~
printf("No effective message!");
8 l5 a+ g& F3 G7 i' u7 A( p. D
}
9 U* W3 l0 `3 s# a2 q9 @
}
; ?& f# x7 q/ ^1 ?8 ~
0 I" T) | ?+ e* C" [
6 E& y$ i Z/ d& I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 l9 f+ I- @6 Y2 S' N
使用下面代码,对内存使用了mmap函数后:
$ h1 d& r2 s6 y% i( X
#include <stdio.h>
% d# R- O! F. w7 q! Y
#include <unistd.h>
8 g3 W9 |+ j! |4 S+ y% T
#include <sys/mman.h>
3 E" I3 ?/ Y) l) f9 X3 ^
#include <sys/types.h>
3 F6 Q! Y( ]4 [6 t1 Z+ G, \& W
#include <fcntl.h>
8 P& e' o6 b* I% H
0 l/ J$ Y: N1 [
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 E6 [" c3 j# T F' q
#define SHAER_RAM_SIZE (0x20000)
) E$ Q- z. Q2 }# q0 N
! t( l- D$ u3 k( R' I5 |/ q3 ^
typedef struct
+ d- z- ]1 m* s5 Q3 b* O: k
{
) \# H( s5 G! }0 l9 ^
unsigned int a;
$ U7 Z' }5 W3 i+ [
unsigned int b;
& Q/ |9 |4 _7 C! f
unsigned int packet_cout;
9 P+ p0 `7 v+ {5 a" Z3 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. e# W9 e" T. U2 b9 ^
' s& z" M9 p5 a+ V/ j
void read_MSG_buffer(int *baseaddr);
- w; C) @0 X, n1 q
unsigned int count_copy = 0;
8 G# [/ c- x& d- y
9 m5 ?% A- H/ K# ]7 ^4 A5 c+ p( ?7 y
int main()
V' B, A# N& A" ]" ?$ P' C7 v
{
# j- M1 ^( |1 [$ ]
int fd;
g7 q, L# ]. _" }% c1 C( T9 ^$ @
int *mem = NULL;
. x9 x' K7 `7 C( k3 q1 e
! n9 O- B$ r3 \! {' q# A( s
if((fd = open("/dev/mem", O_RDWR)) <0)
) Q- |4 T- o; x* P6 W
{
# O5 }+ [! g9 P- A
perror("open error");
! _- L/ g {6 `
return -1;
6 l2 B$ t E+ u1 w/ I
}
7 p. R" Y/ n, h# Z# Q
. k) `. g, j' w% i# D( z, r, x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 Y4 o8 Y1 a9 q* c
7 a; s" y8 o( c3 P1 W
while(1)
$ v: K3 M* W; B# K, |6 U
{
1 O( Z+ N& B# d0 X- p, ~8 {
read_MSG_buffer(mem);
6 ?. v* N1 I, P/ G1 ~ w* w; }( ~
}
: w3 h- `' s2 e- W4 N2 E/ T2 H3 E' _5 F
}
4 a* x2 n6 W! x4 V* g
5 u) h" I% A# ~& U L/ P- }' S
void read_MSG_buffer(int *baseaddr)
& Z9 P9 X3 k! k1 H9 T) P; w
{
) n2 U s6 Y0 K7 z E0 z7 z
pRX_MSG_PROTOCOL pshreRAM = NULL;
( R# B7 b$ ] D6 m& g$ S: b) W9 H
& C* l3 p" j; R
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ q7 x6 S0 R% O, |9 s% g$ L; {
$ z+ d* R# S# n; A! \
if(pshreRAM->packet_cout != count_copy)
- z% o5 ^* M+ ^6 e* ~) l
{
+ X) Y. @) a- h
printf("a is %d\n", pshreRAM->a);
0 r' d: s0 l0 G3 j3 X
printf("b is %d\n", pshreRAM->b);
/ B5 d" K9 q! R
printf("count is %d\n", pshreRAM->packet_cout);
+ e/ {2 w& \+ x {
count_copy = pshreRAM->packet_cout;
2 L! ~$ z- ~2 f; j# d& m5 C q
}
( T+ y0 z* T8 s# d
else
! Q7 l+ X2 i9 r. c
{
9 _# y) p4 u; B- Q' ^0 @, x
printf("No effective message!\n");
2 L2 @3 m6 t2 L$ L, k# p6 `
}
4 | S6 I4 I1 b; v% d9 \9 ^. K6 X
}
( ^6 P8 k& r$ v# i
l% f* \- O ]' G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( m. l0 Q! `+ S1 p5 Q3 U9 o
& p( E e# O% k6 @8 }# B' ~' }
' h6 O V1 T- i3 W- _
# L& D* C6 W" u/ r$ q5 o Z7 b- K
1 r! T3 }$ z$ M' ~4 @
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4