嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ a! C' Z. t% w+ k
# o: _ y4 E. ^7 [' v5 B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& o7 [ X& Y6 }" i
#include <unistd.h>
3 x: m( D! Z; W: A' U. J
#include <sys/mman.h>
7 w8 D0 e- w3 F9 |' m
#include <sys/types.h>
1 b$ |4 W. I& [* }! g, G" c2 [
#include <fcntl.h>
* @1 H2 [( p- h; o2 v, f
0 W/ U0 x/ K: j$ U4 O
#define SHAER_RAM_BASE_ADDR (0x80000000)
* ^$ z. @1 @5 {% |- E
4 w+ r4 V% s+ {1 ^8 U
typedef struct
- }- B4 d" s, A, @+ f; f: O
{
2 E1 s2 H0 ~) @- |* M' j
unsigned int a;
/ l8 e" j! T& x- o* a
unsigned int b;
! b) X: t6 {( T# A5 n. r
unsigned int packet_cout;
3 E: ^1 I% S, h7 ~$ h" g5 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& ]# _# ]9 d9 @# o9 f. y
- c, z, a; Z2 `0 S3 W# p; b' c( O) s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
p, @7 ~# ~* }4 M, W, f
unsigned int count_copy = 0;
* y4 h$ v {9 d. ^5 N; J
) }7 }, l! K/ S9 H9 g# k
$ o) w8 r& I/ N9 S8 n( S: N
int main()
$ @% B! {9 l% j) a, ~: G
{
0 x, R* e9 s& i
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 t3 j* |/ p& U; W7 N$ t
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 b; q$ p& S- o3 c- [0 @
5 t$ C, w3 m9 D# N
while(1)
0 I$ C2 G, m! R" A2 o
{
( D! ~& Y: o* [
read_MSG_buffer(pshreRAM);
- @, `3 Q0 s6 E' i! _# }
}
& S, ?# Y$ f0 d4 r0 ~
}
. ?6 z! H- F* m( w& d
& w O% L/ A, {6 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ r! D4 q$ `3 C2 U% c
{
: k8 N! [4 ^* s7 s0 B' X
RX_MSG_PROTOCOL buf;
. X/ T4 G' w4 G* O+ B5 \
* F3 o2 n3 G9 m; F$ q( p5 e
buf.a = pshreRAM->a;
& R: [' q2 {. f# p8 X0 c
buf.b = pshreRAM->b;
; b7 g; Q/ a" q8 S
buf.packet_cout = pshreRAM->packet_cout;
% u4 O- ~9 f. c" ?" J5 u- Y
+ L* F5 b- j7 z6 _3 K
if(buf.packet_cout != count_copy)
# i! w' ?# p" Q1 s. Z* M; s# w
{
% E$ O7 |5 U" D, }' m* J: M- F. O u
printf("a is %d\n", buf.a);
# s6 [$ z* Q+ z) n
printf("b is %d\n", buf.b);
7 A+ [( D! Y9 q4 Y7 Q
printf("count is %d\n", buf.packet_cout);
+ ^0 T7 N- ]4 x5 j
count_copy = buf.packet_cout;
$ G( e1 S6 n4 @ R: O8 p8 u5 ]/ G
}
7 O! L: ~2 y% m' d& z
else
& i- W# L9 s3 n! J( Q
{
% s! P7 c. G' ~+ O/ o* k o! k
printf("No effective message!");
. R" O0 E! j9 f9 Z; ~
}
' E# r B& O" q- Z) u9 w
}
. S8 s' y/ _# L/ M: f2 i) k4 R
" E }. Y' ?6 @2 ]
1 Q. b* P" A! d3 R0 F3 I; |4 V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 x- H- {: S/ H- A0 A( A
使用下面代码,对内存使用了mmap函数后:
& ^ R; r" G, y8 o$ o& d1 s+ i2 K
#include <stdio.h>
8 Q' H( n$ j8 z7 u) n" b
#include <unistd.h>
" B+ \" E- {$ _/ o0 |( L4 r& ?
#include <sys/mman.h>
( C" v- c( g& m* U
#include <sys/types.h>
. v$ I' q4 Z* i! G; d
#include <fcntl.h>
5 ^$ y7 u0 l9 t% d* d8 j- T
* j7 m% G2 k2 ?( L+ L& D0 Z
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 E! r* Y# Q7 K' n4 K
#define SHAER_RAM_SIZE (0x20000)
% V( n/ m% e6 N# u' |; k4 o4 p
4 I" ~5 d- s u! r z8 E
typedef struct
9 P7 N& c. E9 L2 e c, M
{
/ |1 D9 z/ F$ l4 e# z. U! M" n. K
unsigned int a;
& Q/ X8 A1 v0 U8 z1 ^( p9 d
unsigned int b;
4 v3 d7 n) j9 Q$ M
unsigned int packet_cout;
) g( q7 b, {% a$ x& T; f% t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: ^. ?1 q2 f3 l% o8 [3 K# {1 ?
0 @9 v. ], `! S+ E0 Q- {5 r
void read_MSG_buffer(int *baseaddr);
' U) w: }. I" n9 ^9 \ v+ a
unsigned int count_copy = 0;
3 s& C& v. u% i3 ], [
8 F# ~, s: x7 b$ D
int main()
# O+ a4 R6 n) Z% Y5 }7 @
{
% o2 \, t- h/ v4 m
int fd;
- W6 L0 A" l# o4 ^* h4 k- B6 l! k
int *mem = NULL;
3 a6 f. X6 o$ V+ p3 b$ [7 S' s
& `2 ~ @+ E* C' G, u
if((fd = open("/dev/mem", O_RDWR)) <0)
+ O* k0 T5 N) x% B' h
{
. v/ j! o% F! t4 T. w- m9 l3 Z2 J" H
perror("open error");
' x6 E, H& L" x) f
return -1;
7 W$ e3 v$ z& @$ T
}
7 [3 O+ x# |7 R a; p: p o
' {7 P5 c2 V' u& ~ V& r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 H% D$ v8 X0 d) z) F4 H7 f) B
. Q7 y; T( B9 X( S4 @( @4 l
while(1)
) f3 T$ r' v9 r0 ^. @ ?9 V3 Q
{
; u# {# \7 X9 {7 @9 w
read_MSG_buffer(mem);
2 Q5 V7 x- A# S1 w$ o4 Q( \) X' K
}
0 c1 c& C+ m* `. ?0 T
}
" V; L* J) |( o% N- Z' t6 g3 ~
- ]% P# A+ ^4 Z; A8 k( m
void read_MSG_buffer(int *baseaddr)
3 I% X, Z8 T2 ?/ `3 |
{
, U* e% o9 N8 }/ W
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 p% s: ~6 K. F: b, [2 d6 H& {* A
( C# X% u9 e) g+ T
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* |- ^( E# [" f/ h- E: v4 Q
; W) ?5 I, q" o2 G7 w
if(pshreRAM->packet_cout != count_copy)
- Z8 t+ B& e3 h, I# I. p! C
{
`8 k9 t/ |, l6 g. j0 j
printf("a is %d\n", pshreRAM->a);
' O. T" P# r0 z, P
printf("b is %d\n", pshreRAM->b);
6 x& S/ L" u! w: V. F9 I. j, i
printf("count is %d\n", pshreRAM->packet_cout);
8 Z$ T8 J' i' `
count_copy = pshreRAM->packet_cout;
" L$ n3 d+ `* Z& U0 ~3 `; C5 |% N$ c
}
2 f h" J7 h- R; Z
else
0 k6 q6 S3 O a1 O, ^
{
7 T) m. n- s) v, k) E6 Q
printf("No effective message!\n");
8 V1 x# I5 T# Q' ^5 ]; Y' k
}
+ Q$ d6 J+ c+ I* ~1 q
}
& x2 k4 s% J/ K* w
: D% y% o, \. r. V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: E8 q$ a6 S: P# q7 k
1 v( t3 n W6 Y: N% g
2 N/ m0 ]2 p2 I5 v1 ?5 l
7 U; n6 ]1 @9 b W( M
' n8 ?% b! u' c0 e5 F% |
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4