嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 }9 Z( T) _$ v* Y. O, u- c
+ q" f4 S' R' R1 g0 m0 {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 v/ m: x' o" F$ E3 M$ h" t
#include <unistd.h>
; {# {! u+ c: N* \$ o9 h' J
#include <sys/mman.h>
7 Q/ c1 T& d0 C
#include <sys/types.h>
( A! a |$ {0 |& f; x7 n! t4 R
#include <fcntl.h>
1 Q+ K2 q; i( i/ V! Q
1 f+ f/ ^. {7 Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
) L$ X# C. j% i* q l
& C. i z$ o8 R
typedef struct
9 T9 j( d. b5 s6 z- N
{
`# i& u+ m; U6 O( a
unsigned int a;
) l6 t$ J' D$ X2 D
unsigned int b;
4 B8 r: l5 ]- I
unsigned int packet_cout;
: Q) O3 _, z- g/ i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% P& C1 C* _1 x! B: R; w! |, H( \' Q
* [. o8 A0 N$ h; }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ g0 Y$ a6 q. o: T+ y8 r$ b
unsigned int count_copy = 0;
2 F9 v, j. @) k
6 E x9 f& v4 G1 N8 a. u$ h
& h) ~( X+ j5 J
int main()
. f. r" n4 | ?3 \
{
6 T( Q( l! }4 V) {
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 r' [/ u8 v: t
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# S: ~$ R& Z4 {+ f) U% R
( a. v) g" \' ^( c2 F
while(1)
" z$ S8 C! |) y0 t" _) W/ |
{
- T: ~, G& |) i2 b
read_MSG_buffer(pshreRAM);
, u5 s- P( ?/ U2 Q' A/ f2 J
}
: ]1 n3 A' G# S
}
. Q. c- Q9 q7 r6 E% ~
( `% q3 ` \2 z4 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) z6 S T' h; ?2 U
{
- G% |8 D/ h& f! d1 i( K& ~
RX_MSG_PROTOCOL buf;
( @0 o/ F! r" o' `& G" a% _
1 P. Z, X, w/ E5 _5 ]# p9 p
buf.a = pshreRAM->a;
% h( T1 A* s$ H$ G
buf.b = pshreRAM->b;
/ F/ I( z, N. F8 {+ O8 ~; w6 k
buf.packet_cout = pshreRAM->packet_cout;
4 {$ d5 Z/ [% |! G% H
; N S7 f: l% S1 Q' s
if(buf.packet_cout != count_copy)
/ G* X2 b& O: j0 K5 z3 C7 ~) k. W; [
{
! O* P5 @( j) X
printf("a is %d\n", buf.a);
# b" B6 Y7 y# t5 L+ I; [: V2 l
printf("b is %d\n", buf.b);
4 R" N/ o5 {5 v$ A+ {9 t7 d' j
printf("count is %d\n", buf.packet_cout);
6 i; ]& F' D$ g/ {5 z* r% {
count_copy = buf.packet_cout;
# t: l* s3 x) R- `9 b1 w! E( |
}
- `! q) `1 S; N+ o* j0 a% ?# ?
else
( l8 r4 D7 m, l* j0 G5 m
{
8 \$ S2 r! H1 h
printf("No effective message!");
; J, J& J( A: T ?$ a
}
5 t& u; F2 [- ?0 @+ z; z
}
2 ?2 V5 Q7 L" f: O% W0 d8 i
. L$ e; |. S) n" G2 l
8 {0 F* N' f' i0 T U; h5 H: o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 k, Z n1 M& i" E6 r7 U) k
使用下面代码,对内存使用了mmap函数后:
; |1 @1 v* w5 O; t& ]5 \
#include <stdio.h>
% B6 y# ]7 n& d
#include <unistd.h>
7 T! [: K4 l0 x
#include <sys/mman.h>
* C: X& E; y5 F- }* e4 C( A% H
#include <sys/types.h>
. i# {+ o3 K0 S1 `+ T
#include <fcntl.h>
, H% y9 e! C- {* R# `
) o9 T$ Q. u: s9 W( H
#define SHAER_RAM_BASE_ADDR (0x80000000)
. o6 U" \0 d$ z9 z- U0 I
#define SHAER_RAM_SIZE (0x20000)
- a. C) i1 M3 ]* ?
: p$ J5 \1 |9 u! A
typedef struct
% ]& a1 L; r$ R$ W# u5 p
{
6 n2 ^7 l8 \" `' T& f P
unsigned int a;
5 z1 V, Y, i4 \5 f; e8 Y2 c; ?
unsigned int b;
5 H& x t( j- b2 M% V
unsigned int packet_cout;
- S/ {5 u; H, J5 x* ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% B4 Q/ ~; I2 C& }
9 L! d7 z- L+ n9 S+ K, P
void read_MSG_buffer(int *baseaddr);
5 i: B, I' r1 d- [3 e2 n
unsigned int count_copy = 0;
1 }0 w" ~4 f8 P! i
$ f& n, P- _! T1 \+ y
int main()
9 d8 c- Y( X3 C q
{
; l$ E' _ q/ a& |7 b8 I2 _
int fd;
$ v9 a5 W' [* f7 M& X" ]1 q" J
int *mem = NULL;
. A- J# E( p' G- I2 j+ X1 j
5 G/ E6 _4 f- x6 V @
if((fd = open("/dev/mem", O_RDWR)) <0)
z4 H. O2 H ~6 d5 |
{
$ g' T; |9 e! j
perror("open error");
; a4 d# ?* x) |6 O
return -1;
) a9 c" g4 i4 t( a% r- U2 V
}
: K7 c& f3 {' H& Y1 ]+ [ m
8 [+ y( b% ]! e0 I% M% ]+ p) _
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& ? q# l" A* c/ }: Z8 A$ Q* [& P
' z4 k# E3 b. `+ d
while(1)
) m4 S7 U! ]0 f3 q# B% Y
{
+ U( S- U+ F" T; p: S! H3 p
read_MSG_buffer(mem);
, ^& q' r1 T- q! a8 E
}
4 P0 Q: c) R6 `5 R' }) Y) C& `) F
}
+ n' Q, M: t% K
) r) ]& H( X* t: P, Z. @
void read_MSG_buffer(int *baseaddr)
. V; Q, G6 D4 _ Q& r5 s6 J( O
{
7 _, `& ]! }7 p
pRX_MSG_PROTOCOL pshreRAM = NULL;
* W# `# S" F7 m8 f9 s
# R/ P8 ^! ]: r; v! B6 [0 ^
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 w9 M1 |. T0 A# y3 O
1 v7 B/ I9 K" i* I' O+ `9 L! \
if(pshreRAM->packet_cout != count_copy)
& F. ^. S- H: d) _8 P
{
/ s4 B3 ]6 |3 t# `1 r& `
printf("a is %d\n", pshreRAM->a);
, b' r+ t; }$ L$ Y1 Q
printf("b is %d\n", pshreRAM->b);
( g; L* P3 |1 g
printf("count is %d\n", pshreRAM->packet_cout);
X) i+ M! D. K" i
count_copy = pshreRAM->packet_cout;
/ d. j/ Y, E1 k6 f
}
& p0 Y/ [' |8 p# L% G* P7 G0 h
else
- ]4 }9 b; {' y
{
+ ^* D4 W. A# E/ O" u: n, _
printf("No effective message!\n");
' r" b8 b# z) L9 v; o' i' w% t3 j! |
}
8 P) L7 M- o6 c* K* [: {- c% B
}
8 K0 J7 C( u7 z
1 c% G; F% N* g# u/ S5 U5 d8 i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 a3 n) b4 n* Q/ `, z5 ^- ^
, Y$ O" |- Q0 Q1 P; S/ M, d
9 Y; H& w2 \( v5 F7 B
: _8 R0 {6 d7 q- {
% `$ k8 J0 o/ k% [5 i
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4