嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 n" l/ @2 F! Q; J& U% I
. j* j9 M: Y2 C: q( b( D: i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 m3 z3 y/ R; s( K, B
#include <unistd.h>
# G: p7 \9 S& ^1 J: A* X" ]) Y# W
#include <sys/mman.h>
0 v9 `# Y# A( P B1 L, \$ y0 O
#include <sys/types.h>
) {: v7 \. D8 v p
#include <fcntl.h>
. h" l1 o! G% r2 o4 Z0 k
; U' L" X+ T c5 L& Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 ?% a" J t/ R* E1 E" U* m
+ {' Z2 n" c! K% i* k- N
typedef struct
9 D5 z- x/ B+ A3 ]; T
{
0 F G9 w/ t& w8 R6 k3 R
unsigned int a;
- B2 b" m: |0 L: F( b* S
unsigned int b;
) K5 {. q5 D+ x% ^
unsigned int packet_cout;
. }7 ?) \* v3 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 l, J' M) O9 [% |. D2 x. G3 k, z
- \1 e/ R5 _6 ^+ v! x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. v: Z! K4 u! k# P6 X4 O, l; `7 H4 p
unsigned int count_copy = 0;
: e W' q) m1 ]; B6 o! G* I
9 z/ @5 o6 Q, g; I6 c5 j) N
- b# O9 W1 F; `) Y/ H3 x
int main()
! i4 P' n9 q0 @, }4 y. n
{
" e: c i. w6 S+ r! z
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 z% Z* A$ P2 B8 ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* n, v& @" x! |2 A. `
$ Z T; v7 F0 w- ]
while(1)
* _/ k+ d* N) ]! Z7 a1 _
{
$ M$ x) y5 Z" O5 i9 t
read_MSG_buffer(pshreRAM);
0 q% W* B" c5 B7 H0 q
}
( X/ a9 i, E, h
}
) Y% P. O; M( E
~9 ?) ^: y" a. [0 s* O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) T. |% G( t u8 r
{
% N$ h2 v2 A8 d! o+ m, @
RX_MSG_PROTOCOL buf;
% T' `% }" L4 k9 m7 x$ B
0 N' B( A2 D! \/ ?! U2 ^( r
buf.a = pshreRAM->a;
* d5 Y- ^- t H3 q. [" M
buf.b = pshreRAM->b;
4 m! T1 u$ Z! Z
buf.packet_cout = pshreRAM->packet_cout;
9 I1 z0 h- v/ Z* l" W$ i
9 J+ L( l& Q$ L4 q1 k" L
if(buf.packet_cout != count_copy)
( n3 k1 \: X6 h# M" u" t0 i% H
{
# G. q/ j" @) d% `* y) F; f' O
printf("a is %d\n", buf.a);
8 ~" k% L# A* U
printf("b is %d\n", buf.b);
& |# Y! o# p3 Q# a- w8 s
printf("count is %d\n", buf.packet_cout);
. q0 v3 I R1 C6 L5 i5 L3 s* A) C$ K- b
count_copy = buf.packet_cout;
8 } h7 A4 b6 `, v" b( D: ]
}
_6 z W1 R% @6 ]6 a6 u
else
9 X8 U# w" K: g6 l
{
: R5 B7 h+ B4 @+ T" C K
printf("No effective message!");
# v: }9 T' P* r4 z! U
}
: y. K( X9 ~3 ?! h
}
/ m* h' k1 K2 p7 {) A5 L: y! h5 W3 k
! @3 d0 l) Q& c" p7 _
+ z7 T$ w. }" n+ b5 s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( n4 {- \4 }& L' O+ L$ m+ K. l- O
使用下面代码,对内存使用了mmap函数后:
2 }5 U/ @1 t# t# |. `
#include <stdio.h>
/ b& d/ j( y# b
#include <unistd.h>
( U S c* M- S8 H: {5 z& D, I
#include <sys/mman.h>
' k+ |% g4 Q$ X9 b& B5 V: ~
#include <sys/types.h>
$ q9 e# N( u' E6 k3 z* x4 i* H# G
#include <fcntl.h>
$ n; y+ i, H: Y" @" C" z5 q: i; i
* I& R1 Z: _/ B k
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 F& a0 P" c, a' C
#define SHAER_RAM_SIZE (0x20000)
! U1 H) b$ j* X
. c2 ^; e( m. W9 @+ N4 z
typedef struct
$ }4 E+ S5 w+ V$ L) p3 i8 d
{
% X- P1 j) l s0 n% T. p! d
unsigned int a;
, a0 G7 x6 B( \ P. e5 n3 r
unsigned int b;
v3 w/ B- f: p9 o& R1 U' a) t m
unsigned int packet_cout;
" p4 v( p, T& E3 y; i8 {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ~1 d8 A% V! g. e/ q& V# z
6 x, C+ B4 n& {6 L% h1 P$ l5 A/ Z
void read_MSG_buffer(int *baseaddr);
* j; s- E" Q& A9 y
unsigned int count_copy = 0;
5 v+ P2 ]: l8 {8 K
9 B' _+ y3 Z$ s( E4 b# C
int main()
" a/ t, k! i4 [, w
{
0 K% a+ l6 ~: ^ ?
int fd;
" P! H3 y( T' r0 D
int *mem = NULL;
5 r& D% ~- c) z% v# Q2 R
# M3 m- M5 F; h- n+ K
if((fd = open("/dev/mem", O_RDWR)) <0)
6 w3 ^( l% b' X& ^
{
7 p% k# b+ Z; Z0 j0 S y
perror("open error");
; U0 Q8 Y3 e5 d6 U x) g# [
return -1;
0 r: w" P# _' e% Z$ w. {7 W
}
$ o* i( f9 n! C2 u! R
: l$ \9 z7 U$ n& c# C& _9 z+ ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 `" C7 M6 I- G/ j3 I3 z! _
+ C! c: x) }; d' A
while(1)
' ?3 [& p7 G, q4 m$ r
{
' d* `. i% f: t, L% M4 C
read_MSG_buffer(mem);
; ^7 q6 n- B4 f* }! E' u/ r
}
- U: q( X* x$ Q5 w3 E3 `8 y
}
: T1 g+ |4 H% U7 g$ ~: q
A: F5 |. B. `' p5 [1 P3 N
void read_MSG_buffer(int *baseaddr)
) r$ O/ j/ \; N$ S, z$ C
{
; p. z* ^+ f6 W: I" z4 n+ b" ? G/ J
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 h* i" Q; q0 S0 \3 t5 y
5 L$ \& F r# d3 s. H2 A2 K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 B1 Z' `/ x3 C w
+ V. I" k( {# }" @4 d
if(pshreRAM->packet_cout != count_copy)
: @% y' ^( G! e: i
{
/ K% p! y6 G. L; m- s
printf("a is %d\n", pshreRAM->a);
3 a: m; @* g; f/ s
printf("b is %d\n", pshreRAM->b);
/ C# G. K5 I' j0 C0 B% v( O
printf("count is %d\n", pshreRAM->packet_cout);
' w( D" u; |5 p" g4 Y5 T
count_copy = pshreRAM->packet_cout;
0 o+ Y# ~- W$ S/ v5 T% S
}
( f* ?* Z7 {9 `9 y" v; W
else
; t. n3 W' \7 b4 d6 y1 ?$ c
{
9 n" l5 v+ A& v% ~* O
printf("No effective message!\n");
9 P+ y) | k3 d( B# f/ V# p% |
}
# q8 F2 @6 M6 l: }
}
. V8 e. }! G B* G7 z$ f
+ I' f" N) L) x# m. E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ r8 Z: t5 g' K) Y
" T9 T! ?" s3 j) v$ Z3 T( Y" L3 @/ c
3 k) {* ^* G! n3 C
, ]/ W" }4 |! V
. D% W) w7 x& N$ ]3 N1 i2 V# h
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4