嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 ?! {2 N' `7 P( E# M. _
9 l. U( R2 e5 N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! Z* o9 K7 ~4 ^( b; R
#include <unistd.h>
& n( ]! x! H2 u8 E: P
#include <sys/mman.h>
. j3 ~8 y5 M% G" T( ]) u" T' b$ V+ V
#include <sys/types.h>
) v% g' m( s" U; @! C
#include <fcntl.h>
; o" ]9 O3 [: I/ y2 M
" y; D# D! u+ w. Z7 P
#define SHAER_RAM_BASE_ADDR (0x80000000)
: E6 t! {1 E" H, y h
+ \+ v6 z& J1 o/ J* A( V
typedef struct
& \$ d7 w+ h4 M5 q
{
6 U y$ w8 a' m
unsigned int a;
, N/ o" x5 M1 a7 u: ~
unsigned int b;
) j; J% q! H$ j8 L1 N
unsigned int packet_cout;
' c ~3 H. t# O/ l7 h+ d& Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' G4 k6 c/ _ G7 I) i6 y
( M# ^7 U; o! K* ^3 k7 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* t% V9 b# y+ R
unsigned int count_copy = 0;
- I7 }8 C J0 i. `: _9 Y7 [% D
4 e: I) Z8 \1 i, X" X) l' R8 ?
+ y7 M! b" k+ E4 J
int main()
0 [) [! _5 O4 D# Q
{
# {1 S8 Z O& C
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 A% |# h& m, Z' |2 \$ X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. b' {0 ?+ s) s, u, e3 |& G
, x; g, q) z5 M7 I; Y+ z- C. J
while(1)
, ^/ @& n! A* y& e6 z* y# T
{
! T& R) K# l) g, I8 c
read_MSG_buffer(pshreRAM);
5 T% p2 U" Q/ o5 e1 A' N: O
}
9 X1 O! U- |9 n$ Q: w
}
0 a6 ~* D- e4 {: `* Y
# T- Z' T" y/ K1 n3 }' X" k G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- v: W# l3 a- z! E; j
{
; o0 L/ H% N ]1 k
RX_MSG_PROTOCOL buf;
" b; e2 q5 G8 ~6 `, Q
; u- J4 L4 e1 y9 L- B) a1 v
buf.a = pshreRAM->a;
5 }0 J3 h% L3 x- D2 g4 \0 a
buf.b = pshreRAM->b;
+ s4 N( A# R- E9 \3 f2 s- i
buf.packet_cout = pshreRAM->packet_cout;
; W ~ M* @* k( g2 q/ M
9 y6 R, ^1 n& C" A! y- G! ]
if(buf.packet_cout != count_copy)
7 i: M! ^4 A+ [: ^
{
6 G3 U- I) I* |6 |+ r4 c+ E
printf("a is %d\n", buf.a);
9 B5 ], _6 k9 K3 ^9 B" M
printf("b is %d\n", buf.b);
0 i2 H6 |8 p, N. N4 h$ n' c
printf("count is %d\n", buf.packet_cout);
L6 @0 n! P/ h7 `2 ?4 E
count_copy = buf.packet_cout;
* b6 `) `$ K' _
}
5 h, M% u- S# A% J3 Q
else
0 m( z2 x9 B1 |" J6 u
{
; L! | O4 W5 x1 q( Q+ p, y
printf("No effective message!");
7 U8 h0 o% D5 g& O* w( [) P+ W: w4 C: ~
}
# ?$ J0 |6 S; |1 Q
}
d: E) [& ]4 @; s; H
( G5 H+ U4 p/ z( z; X
# x& O$ d5 o. d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' `, F+ q1 Q7 { w3 d8 B
使用下面代码,对内存使用了mmap函数后:
# {& {# D( C) a% f0 N. H
#include <stdio.h>
j/ [, o( J( ?- `% a1 }6 O. n
#include <unistd.h>
q+ \6 {7 k! n
#include <sys/mman.h>
' D p% T! D8 @/ X J; K0 M
#include <sys/types.h>
" S4 X5 J3 ~5 B$ n
#include <fcntl.h>
5 v- [& \0 T7 D1 A9 M2 Z8 y* t, b
: h: W1 `, f/ u9 F4 m u
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 i. P7 K3 S" J5 p2 m9 U* T; t
#define SHAER_RAM_SIZE (0x20000)
' C2 e1 n2 z, ^- v
4 K: @% |# s+ w r
typedef struct
# p, T9 g2 T+ W+ j3 B
{
8 ]: ^1 ~4 f# i
unsigned int a;
( m' b4 B; |4 Q6 y% Q
unsigned int b;
1 R$ s8 i: `( O* Y f4 W
unsigned int packet_cout;
" _! e: F" D) E# z J9 _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 V, Z( W4 R0 S3 l8 M, e
" a# w+ S2 k# T: ~% X( o$ Q1 n; j
void read_MSG_buffer(int *baseaddr);
@9 X6 _% m+ Q) S) o- [
unsigned int count_copy = 0;
3 O N+ }% `+ d. i+ ]
1 C" Q- w8 M0 @" t! p7 l
int main()
0 m* i1 Z( d' C7 T- E: d9 S- \
{
7 o% F5 z% H% z3 A3 O; H; v7 ~
int fd;
+ O# W2 h9 v; _8 s" d
int *mem = NULL;
4 W2 j8 @" b. m
7 F, M: y. Y: L. n6 _" C9 X
if((fd = open("/dev/mem", O_RDWR)) <0)
' q; t% n8 p$ D z# ^
{
: D1 P" d2 U9 u0 T, h+ Y
perror("open error");
! M: |, g0 [$ n( I2 i5 i) Y
return -1;
# K( g P" R& ~% ?7 b8 W3 Y
}
. b5 c& g& B/ i4 _& J) k2 _8 B6 T
, n5 @( }5 ^ o, i
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, ~, b2 u' _. Y
$ T8 W. E; S9 j( n2 @! z% F1 c
while(1)
; ^1 {* O/ W9 g% P9 q
{
: C5 l P% U! q4 w
read_MSG_buffer(mem);
7 f. k% `) Q& U" V5 R( ?; F* e
}
0 M* |8 @1 O' O- z
}
; A8 O7 I, B( N! K! [
- z: d; v( R9 v" i- |3 C
void read_MSG_buffer(int *baseaddr)
1 i8 ^7 t. C7 z/ a3 F0 S
{
+ L. f) Z7 J. q. N
pRX_MSG_PROTOCOL pshreRAM = NULL;
s, `* w& H; p
0 d! b* z; k s4 K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: @" _2 L4 r3 Z( F- G. i% p& p
3 ~! x: I- N; |. R$ U1 E& b
if(pshreRAM->packet_cout != count_copy)
7 `* }* O5 _& p
{
1 ^8 t) N) ^8 b, s* z! g) y! F
printf("a is %d\n", pshreRAM->a);
" `) f; f2 _# V$ `
printf("b is %d\n", pshreRAM->b);
; [7 u2 B8 ~) _# O: a
printf("count is %d\n", pshreRAM->packet_cout);
( V* [" a! l7 t3 r, B+ |
count_copy = pshreRAM->packet_cout;
: z" b; u0 R* K, y0 ` U7 A
}
; S4 B4 |3 m/ C
else
8 P4 h( M7 ]5 G
{
" i! j0 T/ |! Z. L0 A$ r
printf("No effective message!\n");
, @7 F5 p' t2 p& q
}
8 y( J# U& Q( M) ~# q* S' v
}
' u: |% T2 |( i
: z1 L6 n9 y- ]2 w7 }+ r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) `7 y! `% }/ c4 A# b& E
9 U9 j+ I+ o" w8 v% b# A: G) d9 M5 [
( K! G5 P& D# q; L4 j% ?; l" t
2 _$ R/ \; O. |* ^
' f% j0 F4 I w$ r
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4