嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ b# G$ ?0 r p- @/ F1 @
9 E1 a* g5 u1 G3 z6 M1 y1 S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; G: O6 F% {% \* f/ R9 E) c
#include <unistd.h>
+ D- w' q/ T& v) g' }4 R) J
#include <sys/mman.h>
6 H: C" s- G) y; l6 T }- \+ t
#include <sys/types.h>
7 I0 z; g/ u# z; {% K2 K$ q/ {
#include <fcntl.h>
7 m: _0 R- H0 e7 j: e/ J0 ?
) w+ O1 a% p' j6 Y( n
#define SHAER_RAM_BASE_ADDR (0x80000000)
. x$ ? e" w" z+ n! t
! P% Q( C# I+ X. I8 \. {
typedef struct
. K/ J" A3 T7 M( `# y; U
{
[0 R6 B; S0 _% ~
unsigned int a;
0 f$ @) k7 E* E" w: Z1 D! E1 E
unsigned int b;
) K0 W% q5 k- p
unsigned int packet_cout;
, r. \7 P& u# S) V) j& M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# a2 g1 B5 b6 D P& a- V
; R' m3 c! t0 G8 z. J: g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 s3 |, t' m6 [( p" s' H7 B9 `5 h
unsigned int count_copy = 0;
4 ]/ k$ ]% T* {6 |' T
0 |+ t/ U3 C3 j5 Y3 _7 j3 D4 r5 W. V
) @5 @9 w5 B3 v3 z K+ E
int main()
) N5 `/ Y* K6 q; D* F; g: R
{
7 F9 s% t$ g5 L0 J
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 ^5 r# S3 e, i% f4 V
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! R) p( c- S0 h, V, k) ~4 f
+ S8 v3 u. `* E# V1 n
while(1)
" A+ R8 H* l$ K+ {) P
{
' Z( y8 f/ x) @9 r& @7 g
read_MSG_buffer(pshreRAM);
8 R0 f' u+ T4 }+ d
}
7 A6 D9 t( o1 K
}
3 _5 N0 g7 |9 o! c" Y" e3 U
8 w% T: U, I: i* G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
S1 E3 }; F" P& @+ j; `
{
3 j1 z0 ?6 X# y3 M* y
RX_MSG_PROTOCOL buf;
+ M \. F/ z0 K8 k
; |! Y. E1 ]- }8 e, O; b( w `" T! E
buf.a = pshreRAM->a;
/ y/ m( d7 h K* \3 ]) ~9 M
buf.b = pshreRAM->b;
# v6 U J6 ?8 g5 v
buf.packet_cout = pshreRAM->packet_cout;
1 m6 R* h: V: H# f1 V7 D' [) d) ]
9 q9 f0 n) k; T+ z+ Q5 {) r$ C
if(buf.packet_cout != count_copy)
5 k! q, W% l+ t" }& Z
{
8 M# S7 ?7 f# K' z! R
printf("a is %d\n", buf.a);
/ }" b1 h |2 w0 _( G& Q
printf("b is %d\n", buf.b);
4 z7 ]# n( G4 A$ U8 p* \- m
printf("count is %d\n", buf.packet_cout);
$ O0 Z/ H* g/ p) \% q( M5 L
count_copy = buf.packet_cout;
8 g5 v/ V' q1 `$ A
}
# n/ C m j+ S, M/ O8 Y! h
else
- i! D- r' V$ f+ Y ]5 R& ^' i
{
# j7 S+ q5 o b
printf("No effective message!");
, ~+ r9 a, {$ H
}
. P) G; k6 U, a3 y- c) n
}
# y c" R0 M0 c; G5 l; @% L0 a
6 A0 R/ T' k+ x; b t& Q$ V
0 N! |, B7 ^* B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ U. S/ F2 h8 x# S
使用下面代码,对内存使用了mmap函数后:
- O; ?3 h9 J" K, P2 X' j
#include <stdio.h>
/ Y( ~% T0 U9 I6 M- z) S5 i; N
#include <unistd.h>
- _0 H% l2 \& |
#include <sys/mman.h>
. Q1 Z% ^; |. p
#include <sys/types.h>
8 \5 X, a" F" x
#include <fcntl.h>
0 t0 w' N( Q! h/ S+ Y" P0 {/ ^- h
% [) B; N( m/ S' j8 @( I1 k
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 S' y/ L. [: s7 ?2 j
#define SHAER_RAM_SIZE (0x20000)
9 \; K' A9 }8 c( @$ i/ W# e
& e9 q. D, J/ w5 u$ ~
typedef struct
; }9 J/ Y' u# j) `# W
{
' v0 N; v' i3 y/ v
unsigned int a;
$ E/ i2 \* k) e/ J0 B- b
unsigned int b;
3 U( m* [- i2 b% e% R4 N# x
unsigned int packet_cout;
* a+ v: j# ]! M0 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 u2 f: b& f3 ?) ]
, e3 j" P9 `" F
void read_MSG_buffer(int *baseaddr);
7 ~8 c! D7 i& X" Z; U. n; O6 P
unsigned int count_copy = 0;
) D# \" y( a7 @! d9 r! h
0 \& [# G5 K. r
int main()
) } s1 G+ R* o7 ]! A
{
0 {* u1 D! v# A! y2 t; `2 h6 L
int fd;
8 q2 G h- @' @' K" ^& Y9 m) V* t
int *mem = NULL;
8 y1 S( ?) ]" _- o4 k! o' q* x
" B8 [" {2 _4 R" N
if((fd = open("/dev/mem", O_RDWR)) <0)
2 z- a# m6 u9 R" Z$ }
{
z4 J# S3 O$ u% l! y% `
perror("open error");
j& N& Z2 _, g' N
return -1;
& q1 S+ R. X. z
}
9 h$ r, h2 u/ N S' E
7 \- }% _ [2 a' ~8 I( g
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 h5 W+ w* \& ]& s
, M6 x/ F, |" b% ^
while(1)
, a; x( T. U7 M# ^; @
{
7 w* i: R' \; k3 I3 w
read_MSG_buffer(mem);
2 p, f6 B) @3 g6 k) {! X; s. b
}
4 u @. g+ h$ F4 c: ~) v0 q
}
8 M, h1 {) O: y$ t# I" S6 ]
1 r r2 K! K' F
void read_MSG_buffer(int *baseaddr)
5 S4 e7 U" j( b6 j9 Q) {
{
' ] R1 l6 |0 u! K5 e: @' _1 a, N6 p
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 U4 [" ~7 o4 J4 x. C4 u: u6 ^, @
9 d- y! m( O2 u$ C# `0 ~
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; K; F2 }+ U0 e+ @
4 D0 ^5 Z; U( Q1 S
if(pshreRAM->packet_cout != count_copy)
; M$ h9 ^1 i1 R. _& i9 j2 ], e/ G4 @
{
- t% m. p+ P8 L( v! \: D3 z
printf("a is %d\n", pshreRAM->a);
p$ c) R. ~/ w: y
printf("b is %d\n", pshreRAM->b);
1 v5 X- `+ `( ^
printf("count is %d\n", pshreRAM->packet_cout);
" g4 k+ V; J W1 L9 y/ H
count_copy = pshreRAM->packet_cout;
( A* Z! J5 E6 C. u; {3 s
}
5 s0 |7 D6 u5 z$ T* ?3 j* D
else
: j* z* m( Y+ R" v+ l
{
% J9 P N$ m5 ` P+ H
printf("No effective message!\n");
0 J( u" @0 y+ B7 r9 A! w
}
( e$ S' N: s: W4 |
}
?' O7 @, u8 S. }+ h# b' \
5 L8 x. w5 K8 o6 R, e3 A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" i0 Z5 [# \; m2 k( X8 Z
Y$ u; v7 d& J" c. V9 D
' b5 A& s: o; U t* \6 n/ q
K- B+ n6 Q9 ]8 K( [
- ?2 A% h, M1 S" V
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4