嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 v4 i- u& ?8 v8 X. Q1 \1 Q! y
& d5 C6 @( K. q5 @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% }; ?; V/ }; L! f
#include <unistd.h>
! t1 S8 t, z( H$ S5 p8 `( Z2 S
#include <sys/mman.h>
1 p T+ n {! v3 n- l5 t
#include <sys/types.h>
- N' K* e# n4 I# q6 A: d5 @; u
#include <fcntl.h>
" z8 b. K: B, H# f
& l/ D; [' b% m+ w5 P1 q
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 [$ @: Q4 w: E7 a
' V9 F5 a! Q0 U( e4 b, d
typedef struct
0 q2 k) d8 K- z" {
{
, W2 Y# L8 f$ k$ j; [; y/ h
unsigned int a;
* [5 D: P) I A
unsigned int b;
5 z1 S( v% I% O+ ^' t! c6 S
unsigned int packet_cout;
7 |* e$ Y/ }; R% o& M: n& v9 j1 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* P6 _3 U. k7 j0 O8 f0 P W
" i( X% l/ v! a4 y# I; {- l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! n5 f! F' a- A9 {7 X" n0 d! _: {
unsigned int count_copy = 0;
. ?4 H% V( L/ h7 s0 Z0 H+ n
( |( f- `! n) L$ L) C. j! n: Q
! r% T# x8 w! T* T) O$ ?
int main()
* u, a u* t- X/ P! Q' @8 t
{
: o( k2 r( f' Y: l D, T2 s
pRX_MSG_PROTOCOL pshreRAM = NULL;
j* \+ N" ~8 x! P- c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
n$ m/ R" @2 F' {/ `/ h. S
C, o! W2 M6 P
while(1)
( J9 E1 S- y4 A8 Y9 a
{
7 _" C5 a6 j: x+ `# c' [1 {% b, n
read_MSG_buffer(pshreRAM);
5 T; S: Z* s; P
}
! @6 D& T% l+ N1 p) a8 d( d
}
0 x/ s- e. P, _7 p7 C" g: N+ K( P6 L
4 }" b/ o4 f3 e: z4 `% w; k( B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 Y2 s& W+ C+ A' U8 N+ y/ M- k
{
?7 w5 p ?$ P8 |1 m4 r" @ m
RX_MSG_PROTOCOL buf;
% H2 h* p7 ?1 {* d( Q$ J# m% n
' D- g$ X }; o6 [
buf.a = pshreRAM->a;
- Y- G% O9 p2 G, q3 } m1 j
buf.b = pshreRAM->b;
* m6 w4 m5 Z+ f. b
buf.packet_cout = pshreRAM->packet_cout;
( b0 s( z4 N* `& B% E- m
q) e: L3 X+ O' \) J7 j! k4 g
if(buf.packet_cout != count_copy)
- r6 d- A- c0 m$ |# D2 V
{
- A+ A" \ G0 d: z( F7 O
printf("a is %d\n", buf.a);
' I- F J9 h* z6 X5 u& g" q- f* A
printf("b is %d\n", buf.b);
/ G. E% c" P' F$ M8 G% l
printf("count is %d\n", buf.packet_cout);
- d# R+ Y' Y5 \& l3 K2 d3 E0 r/ z
count_copy = buf.packet_cout;
B# @0 j Q N
}
" t- l/ @, d0 [/ s
else
4 H% ~! y- T1 i) d4 e d& B
{
4 ^2 u# R% `: i t8 q1 |* I. d: e
printf("No effective message!");
. Q0 |8 T5 U" e; }, f# m( P+ k$ S2 P
}
. C5 y- P( z# U
}
9 K0 F* e3 Q/ Y! k* I
" ]$ z( r- h5 {6 I' Y& J( B
$ }. o `0 o6 b" E U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 j1 ] i" O6 J/ p7 X
使用下面代码,对内存使用了mmap函数后:
' q& Y7 d7 v0 r* O. k( p
#include <stdio.h>
. u1 o+ p. B3 v/ M
#include <unistd.h>
9 }! u8 j$ E; r' C0 F: Q
#include <sys/mman.h>
& x; y8 e- J2 Z; v7 X9 r
#include <sys/types.h>
9 H9 J4 a$ C: K7 Q4 Q4 N# P3 s5 h2 s
#include <fcntl.h>
4 k( M' @) s: I j9 Y7 N
9 m" i: t$ a E
#define SHAER_RAM_BASE_ADDR (0x80000000)
! F J8 u& J$ k0 o
#define SHAER_RAM_SIZE (0x20000)
% G4 B0 y+ \- I8 M, v
" d5 j0 h( o. {% _$ y) g- P3 W5 M
typedef struct
7 n/ j7 a- A0 E# h* w. R' P i+ I; c
{
+ T- G% C# X6 J4 o7 N* Q2 E1 t7 c" T
unsigned int a;
# C+ L% I1 k# T
unsigned int b;
. x% F' K _' Y& h9 C$ o% R8 e
unsigned int packet_cout;
6 e' @, t+ p- x# r H- ?1 J% |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( M9 {1 G2 [9 c, y
' L- v( z: G6 P8 Z# R5 U
void read_MSG_buffer(int *baseaddr);
+ |# v7 a5 c$ i- U- v9 @- e: m6 ]
unsigned int count_copy = 0;
" T% Q+ `& d/ d3 I
: @" f) z9 C2 q3 ?" k% a# n8 ?
int main()
F3 q; q' X/ |3 \
{
5 F! a5 l( M# V& a+ c+ S' L% \
int fd;
% F) A4 v5 H% A ]4 z2 Z7 p) m2 o
int *mem = NULL;
4 L6 _7 P8 c2 r0 E9 y7 Q1 S5 Y) g
8 g: E% i6 H+ w$ x% b! }7 y
if((fd = open("/dev/mem", O_RDWR)) <0)
6 N+ F/ x9 P4 C$ r. e3 z7 K1 m; r2 z
{
9 P7 v' d; {. w: S" ?8 o
perror("open error");
; I; a# \& j& z4 d, s3 w
return -1;
% n" p# ~" ^+ z, D# Z* {
}
+ a/ s8 \0 x* }! p* s3 D
! o9 \! M* E- W4 e* x4 \/ b" U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 A' Q) j! ?& V0 G2 \. W9 y! u
4 N1 t" } p- R2 J: o) n
while(1)
! X0 A% K" h$ e% K
{
4 A. S4 e6 ]: { ~2 r |9 D
read_MSG_buffer(mem);
6 o! e7 ^7 Z5 M" |5 P' p( g
}
! V N# E {. ]$ ?: \ ]
}
1 j9 [7 W- r' a: h
" ]9 F' A& P! p8 _; T% l4 a
void read_MSG_buffer(int *baseaddr)
* x0 K8 y& z/ b/ l3 {& E' J
{
% R1 ]6 D3 h% A! g. H! x9 [; a
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ n* |# T, ?( V( C# n
) ~) b% B: g1 I/ i5 Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' K9 n$ U6 L3 H- V9 C( K' F8 i
, i: b; b5 j/ ?3 Y; w' B
if(pshreRAM->packet_cout != count_copy)
) b5 L, f: x# v0 `; s0 x
{
! e% v3 Q5 j' @' a# I, q
printf("a is %d\n", pshreRAM->a);
1 T* b2 o/ s2 t1 r; L! V/ S6 K3 L
printf("b is %d\n", pshreRAM->b);
# B% t' a+ X4 y7 A
printf("count is %d\n", pshreRAM->packet_cout);
3 k5 g# o/ y' a0 B. ]
count_copy = pshreRAM->packet_cout;
% ~# {! s7 c. I* i$ M4 Z6 j" F
}
" j0 g7 }3 H+ @" j6 N( f3 o
else
6 h( F" c' l' ^5 d# }
{
! P, Y3 S6 @7 A) o
printf("No effective message!\n");
! }; A$ Y( ]! C$ C7 }1 E) {6 ?. o" G
}
$ X: h" } j) B! i
}
- x, J: O/ Z. S6 E) I% _8 f h
1 G/ }0 T' o8 m- D0 r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- V9 e& T+ ]4 ?5 b2 B
# I. y0 j2 y* Y/ p8 z- w5 s& ^
' N7 o, Y s$ ^" w) f/ a& V! g
3 |8 s2 w* \. L
' y. |! [3 B: Q/ h. c0 Z9 n6 x; g
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4