嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 K+ ~4 G; j9 E5 ^/ k p
t1 M* C4 f8 |! D* Q: j7 b/ @7 S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ b% A; Z; d5 x2 j; M
#include <unistd.h>
- ]4 n; U7 u5 a9 G, Z( s
#include <sys/mman.h>
- H3 v0 X( M' |" \7 H" Q3 K
#include <sys/types.h>
8 F$ g7 M) v! c6 z6 B' H
#include <fcntl.h>
3 s4 X% }3 d$ k8 L! B
4 O9 E* z0 v, D+ z
#define SHAER_RAM_BASE_ADDR (0x80000000)
! L0 `- j6 L! C9 p8 i6 q3 M3 H% j
9 m1 g9 {/ d: G
typedef struct
( `9 a4 {* p+ o, y8 j9 d
{
/ f! v2 F5 h, w; q/ P2 l8 ]; q
unsigned int a;
4 F2 b6 h* F0 y# V$ J0 V
unsigned int b;
3 f! K( V: N+ T2 ?$ j
unsigned int packet_cout;
( R! V& a d" u6 e1 D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ R/ c+ A0 r; Y* F; }3 o# l% b
: Z* k6 f; P H( F: B$ N7 w' z+ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 I; M( S5 g' ?0 K3 Q' k
unsigned int count_copy = 0;
; B! H( i* ~$ q; E, O& W
. }( C, l9 l$ c$ a1 `
! B4 L9 t; i, n0 e
int main()
7 I0 ]- b# H$ d2 M) U( \2 |' a
{
' b2 M. F6 w- v
pRX_MSG_PROTOCOL pshreRAM = NULL;
! ~+ K8 H, E' H1 y: ]$ o- K: i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, W* R" z& p1 ?/ {% N
9 x$ Z) e# y& J* N6 ]+ h' r( w7 E
while(1)
6 _$ G% Y) U5 O" H; C
{
) N: t' M) i+ n
read_MSG_buffer(pshreRAM);
. o* }+ D1 T2 y
}
6 v' f4 j1 _+ }8 z* s. l
}
9 q6 q/ R4 r5 m! c
; U6 a' ^8 q K8 b# N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, R w' c3 O/ C6 t
{
% x3 t/ `9 N4 Z( _
RX_MSG_PROTOCOL buf;
1 `; h7 O5 d. C' L5 C2 H+ Z
: Z9 ]6 o4 Y9 a! W
buf.a = pshreRAM->a;
6 \$ p8 g3 F; d6 m' ]
buf.b = pshreRAM->b;
* X) _! G' o+ B
buf.packet_cout = pshreRAM->packet_cout;
* K* I# h8 |8 ]1 _/ v- `
! j$ A5 a5 e* m* }+ ]* H
if(buf.packet_cout != count_copy)
; {$ y# o) A$ k1 a& K' R- _/ c
{
3 D7 o# r5 T. e. }1 D5 {
printf("a is %d\n", buf.a);
2 d* ?2 K. A7 Y* x; w% {. e
printf("b is %d\n", buf.b);
8 i! e( g' a; L% a5 a2 S5 G
printf("count is %d\n", buf.packet_cout);
% X5 x: s- |; \4 r$ d6 a( E
count_copy = buf.packet_cout;
1 e5 `, u$ x5 z
}
5 S6 h% h) ^6 C2 z4 M
else
& k' N, G0 Z0 |8 ~' B% c8 L- Z
{
2 j) g8 T. [* M" T
printf("No effective message!");
$ ?6 F3 Y8 L4 s* u/ H
}
* |" s8 [3 m7 G' a6 `
}
3 D( A' s" u! A" o7 b
1 k9 L& d# F/ S2 H
$ l" r' i& l& j8 [: F, f; P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 d. e5 H/ W f' s" G- I; D
使用下面代码,对内存使用了mmap函数后:
- a1 j8 b4 h4 G
#include <stdio.h>
+ C7 X5 L" H/ q6 P0 z7 W( x" j' _
#include <unistd.h>
) f$ B1 l9 H$ |3 m4 U
#include <sys/mman.h>
/ @ j S$ Q% C/ T9 ]
#include <sys/types.h>
/ G$ w- K2 E3 Z! w: w9 d
#include <fcntl.h>
1 M" |0 `( B8 p8 \$ V
5 m! x0 v1 ?5 }6 m6 `& Q" g
#define SHAER_RAM_BASE_ADDR (0x80000000)
[, T3 e1 o) r5 c ]* e) p5 o& S
#define SHAER_RAM_SIZE (0x20000)
4 _$ F! X4 n& M, R& d
# o! N6 `8 b, Z3 q9 o9 S% ?* |
typedef struct
Y3 U1 _5 Z5 E! H: P$ v: E$ Y: |3 {
{
) x8 X3 I8 C! G# T2 v$ ]* T
unsigned int a;
% x! t C' s: {( O# S/ @. z- g
unsigned int b;
8 e, G7 E+ L: m: ~, L9 _2 k& P( G
unsigned int packet_cout;
4 N x: P0 ?% j8 ?8 P- d3 M; P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: G; m; T7 G8 t) M. U: r! |
: D% L& |5 c' ^
void read_MSG_buffer(int *baseaddr);
6 D" c# K; u' K: P: P
unsigned int count_copy = 0;
1 t2 z8 Y- L! G* s# H8 J) l
9 q. D. l7 v7 A( D" h3 L
int main()
. m8 y- D; x. \
{
5 B! I P& m" w) J0 V
int fd;
" V6 P2 C9 N2 S. H% ~* V' G
int *mem = NULL;
0 v$ H0 C! h" X3 W8 q# _$ h
4 F$ u3 n/ Z2 e/ a/ x4 e- W
if((fd = open("/dev/mem", O_RDWR)) <0)
# U7 k, @$ C @% P& D
{
6 M% l* ?: d+ X( U( c
perror("open error");
x* \( i% F% V! S; {
return -1;
; |1 w/ T! U4 Z; M) m4 D
}
' {6 _+ [7 {- Y! v: d& S- y
9 U5 g- m0 W+ X9 _/ `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& ^( s0 _$ e+ H& W: i' |
3 |) t' z, P% B8 ?9 `
while(1)
9 M, g! c7 c5 k
{
Q6 y0 n, G( x, k" C3 | X* a
read_MSG_buffer(mem);
2 ^. R1 Z1 {1 ~4 [; @
}
3 ~7 x0 ~* x/ \% b6 R' r
}
' z# S; |9 k4 ~
_+ r; h( H# H- d/ H: J
void read_MSG_buffer(int *baseaddr)
0 j$ J" F& g$ \
{
/ f4 d& y4 Y9 P. d6 b _, ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ E8 |" t0 V" r+ s) E" q0 t+ x
8 E; l) ^1 a6 X- N$ S- l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, D6 R Q0 y! `! ]' ~1 ^% W
- N+ f8 a* f! W+ c+ O* _; I
if(pshreRAM->packet_cout != count_copy)
# _2 @, N; {6 {2 g7 m+ n
{
8 L0 Q6 H5 {/ z! h3 t) g3 }
printf("a is %d\n", pshreRAM->a);
1 B2 D5 n* C" O
printf("b is %d\n", pshreRAM->b);
' F+ M" k8 _3 c! X
printf("count is %d\n", pshreRAM->packet_cout);
; h/ E/ l: |4 j- ?( G
count_copy = pshreRAM->packet_cout;
+ m6 y, [$ q& X4 |5 B! r3 }9 C& s9 i( i
}
. L* \/ S5 a& U! O
else
1 g4 ^# A" P- n
{
3 i8 r) S9 o h
printf("No effective message!\n");
( n3 y& G9 ^$ [; b' ^+ {1 l: f
}
( r7 K* P3 f1 n4 a
}
9 R* l8 x% x2 D! I }3 D
- |: e" |' G& e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
J2 ~+ e! ]: N& P s! t% u# X* x* |
" f3 c) ^ n8 P @" ?) G* |
1 ]. O, k/ E% w. G/ z0 U7 ?$ M
% x: s; H# B$ R6 T1 h/ d3 [
k, l. g* U8 O9 U' n8 y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4