嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: i }. [ B" a/ C5 s7 x8 p8 r
! G; r; l ^" \% N5 C; Y0 t) c( F" Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: M) t% ]2 o/ h" r. Y
#include <unistd.h>
2 f, e; G& `6 k$ x# ]( v' y, ?
#include <sys/mman.h>
% ^" \- l" x3 A* K
#include <sys/types.h>
( Q6 z* N# d! x+ c
#include <fcntl.h>
" Z$ }7 b+ F2 O
: h r+ F* Y7 s
#define SHAER_RAM_BASE_ADDR (0x80000000)
* V9 t9 ]4 R+ G) U* Z' u7 F
, U1 m. t$ J, E
typedef struct
- ~" }# p3 I# c7 }, I
{
! a2 e5 J5 C. B% z/ Q
unsigned int a;
+ c1 t+ d2 O$ w7 g/ Y
unsigned int b;
1 k Z# u& h: N2 D" s: L
unsigned int packet_cout;
9 u+ J) t" C( V& x3 O2 l2 J9 D+ ^! @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# f+ j3 v' a) x1 D: ^
- `2 I; ?& ]/ q* E, h% T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 y3 r) Q" O4 ~ g0 M& P8 ]# j
unsigned int count_copy = 0;
; S/ x& O+ d3 n3 Z) q
. p w. Q3 I) v
9 X& j$ i/ {+ ^( d* B
int main()
; D% S5 f" k& o: ~9 O) p
{
( n- j. F5 H) `4 M7 }" R
pRX_MSG_PROTOCOL pshreRAM = NULL;
- k7 {9 w$ i) {$ F8 J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! t1 M2 P/ O9 X T1 [; ?8 w
. B' g4 e/ @$ [2 u- f ^2 `- o L7 u
while(1)
3 w2 R, z7 ~( k
{
' Y w% Z6 P) o- b
read_MSG_buffer(pshreRAM);
1 q/ @/ Y6 [9 Z
}
+ B- K, J3 u; @4 y
}
( K- e# G7 }6 K6 E; `9 M/ h- H
i. t; f Z" s3 L5 k( N$ w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 N j( v) v- V3 o" }
{
) w; P5 W, j3 T
RX_MSG_PROTOCOL buf;
4 E9 ^* Y( A0 ]7 Y" D
6 D5 h- G7 W8 h1 ?+ m
buf.a = pshreRAM->a;
% s) U3 r$ I- H O4 P0 e
buf.b = pshreRAM->b;
3 D% G0 p% a2 b: W# C
buf.packet_cout = pshreRAM->packet_cout;
) X8 \) q% Y7 S
: \! g) C/ s; B0 o3 ^0 c' U: L
if(buf.packet_cout != count_copy)
# }8 p: S% j( m& L/ A
{
1 H; @1 I) k" G' O/ r5 _1 S" @" F
printf("a is %d\n", buf.a);
! r( p& k3 [$ p4 v& C _& Q' R
printf("b is %d\n", buf.b);
d1 \8 P t2 p) I- _
printf("count is %d\n", buf.packet_cout);
5 Z9 X6 Y( D* S4 w+ s
count_copy = buf.packet_cout;
! O$ G3 a$ p7 ~, w0 t* y8 F
}
* n1 z4 u& P& c! L! l1 M$ `
else
. x3 z9 ^9 q! |
{
/ q, E' o/ o1 Q% T1 H' B( C9 L/ G
printf("No effective message!");
" L8 a F) X. L
}
( V4 ]$ |) m2 w
}
" O! F9 J; k. w
" G& T8 l5 {" e: [6 y0 l8 U: x
. e- [, } a) a7 H; T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# r4 C2 p5 A- M2 E8 N5 g
使用下面代码,对内存使用了mmap函数后:
& n# _, v& D* d$ _* b
#include <stdio.h>
( B* M5 q/ O1 j9 c5 @6 M* p
#include <unistd.h>
( E# D0 N# j; Q5 C- \; ?
#include <sys/mman.h>
0 [5 s$ ]( `, l0 R5 k: u2 t
#include <sys/types.h>
6 q+ `: o9 c8 J, k! d: d
#include <fcntl.h>
0 x p# ~" X( U
5 S9 J, ]* z8 q3 T
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 z2 C2 S( T6 q/ K5 X( M8 j4 u/ W
#define SHAER_RAM_SIZE (0x20000)
# @& \( d X1 `7 \
+ Q- G* \% |1 N0 J, Z, `- }( j
typedef struct
- }# }( Y" N1 f7 n! D0 [9 K6 R
{
% _: E P/ C- J: N& H
unsigned int a;
2 N8 _! z- ~" ?7 z6 A- }: v
unsigned int b;
4 m; p) O2 {6 B1 ]. i+ \ X8 m
unsigned int packet_cout;
8 C. r. W/ K) ^* c$ L" J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( z8 b M: q$ x; p9 c7 X: B
U7 H0 C/ y' b& [! {3 w7 f
void read_MSG_buffer(int *baseaddr);
( h, e6 @% E3 C+ J5 }- [: }1 M
unsigned int count_copy = 0;
, u* {4 i- t9 E5 A& Z" {0 B
B8 O) y4 m+ `% V: F" G
int main()
7 D6 |' {! r1 R0 f7 i, F# c, s
{
: N0 k7 k2 ^& B9 V7 C) h$ {1 T5 f; e" x
int fd;
/ z: q! P4 G% \* V5 O# j7 { T
int *mem = NULL;
6 d: K* }# z. B& X# o
. d+ w9 _$ f" h) {! v/ ~
if((fd = open("/dev/mem", O_RDWR)) <0)
+ G! [2 R; x9 N2 T& U; U4 f* f
{
3 |6 b+ ^, N$ i2 O: {* g
perror("open error");
, W; e6 @: b: A, @
return -1;
# x( o+ a9 w; b" J8 G
}
& f! f4 V* u0 I0 @8 ^, q7 h
& c) f; O, G2 b. b: K2 _! `: M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 w D" H& b: R b
0 E9 |1 o- m+ c4 a+ L8 c4 D
while(1)
/ h' S. P3 g" V# W$ {: @
{
9 U4 C. N7 I& k6 q
read_MSG_buffer(mem);
) y3 T2 L" [, ?/ m* ^$ h6 e
}
7 S# w ^* Y3 w
}
' }( N: s4 ]- l6 S
1 {4 k8 g! G: s& X2 @
void read_MSG_buffer(int *baseaddr)
* k M6 G; u5 ]7 G0 A. \) ?+ d2 t
{
" K8 o, g' Z: k$ c
pRX_MSG_PROTOCOL pshreRAM = NULL;
' P- c2 \+ D& {" k
- V t, R( i# T6 ]& M" M
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( k: u- J# f; |0 z: X% q
8 r) d: _! X) ^/ @' V
if(pshreRAM->packet_cout != count_copy)
( x, Y' K* |! l" w% K# H
{
& j' J% f: Q3 a* [
printf("a is %d\n", pshreRAM->a);
2 h. q5 J5 Z6 F* g
printf("b is %d\n", pshreRAM->b);
4 E, i/ F8 q" z9 M: b: V9 s$ i1 _
printf("count is %d\n", pshreRAM->packet_cout);
% B5 |4 G' H l1 L7 n5 k! @% T
count_copy = pshreRAM->packet_cout;
3 V+ Z) Q9 ~+ i- {) ^$ z- l) I
}
" V7 G& v* z2 g Y9 g6 g5 a' h! b& |
else
9 C& \ N0 j; c$ M+ U* x& v
{
$ [6 W; _* ~& D( T" W
printf("No effective message!\n");
$ d# s+ X" a) v! I9 i
}
; g$ b: p! W, u3 E: v5 Z
}
3 ?; _8 R3 K3 l8 K
9 X* e8 J5 g q8 q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 D3 j( b. r+ A9 o9 K4 I3 Z
4 |" N# ?9 m: l, }5 _; ]' n, ~9 I
6 t, E+ T- e6 h: A, h- `' f
# t; E% g: Z: K7 H
F6 b" J! R: ]1 Z6 K
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4