嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 }* G1 Z+ X7 b# b' N5 C
5 z. f$ g* R5 ?. I! n3 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 U" ~+ I6 H6 k \7 h1 r0 g
#include <unistd.h>
5 H6 u, M# j$ y1 _+ t5 ]: q
#include <sys/mman.h>
2 X5 U/ x) O$ T5 z- b& z' y% t; P9 r
#include <sys/types.h>
3 }8 W6 k1 W0 r6 j2 G8 W
#include <fcntl.h>
; Z$ F6 N3 w* J& v; f
( K7 E3 e" S0 E' ]4 z4 v& f
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 }& ^! b- J" W# ~6 `' [1 b
' [! E' a3 R" j! @( |, E3 {
typedef struct
4 o: @4 _8 s' c4 ]
{
. }$ \9 X8 y, W- l( y3 U/ y
unsigned int a;
- |8 Q- e& [9 \7 \4 B9 |. o
unsigned int b;
5 m' p7 j; b U" d! ~
unsigned int packet_cout;
+ _3 F5 d& H4 A k( v/ f0 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 b7 [( }* R, s) Z
3 j. |+ H0 d# @: Q4 q$ t+ q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& a, M3 p" i; G6 `2 S# j
unsigned int count_copy = 0;
% l% t5 B2 p1 R# N; W
8 l' a( v# F, E* q, K
; b9 A2 r7 ]" T! J
int main()
4 ~/ Q. J; Z+ C; ~( O! F/ A9 R5 x
{
( F0 v% ] {, v0 |' @
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ v+ a0 z, ~) J$ g9 y3 Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# e1 ~- j# w% D" h
! g* L" y" p) ?# }" H6 h
while(1)
; C+ n7 F3 m, k8 }( Q& T
{
4 q7 e X; g6 c! |/ k' K' X
read_MSG_buffer(pshreRAM);
% X: _, V0 o8 A8 f: ?7 Y& R$ s
}
8 f0 `7 a) T- E5 O; k- b
}
8 ]+ X3 A' n# O* F# o+ k
: q& X) ~; v, I; ~, [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 T& e8 y" ?3 e+ E% h$ b
{
8 _6 o A6 ?/ R% d) k# L# w" l9 P
RX_MSG_PROTOCOL buf;
7 ]! N: m1 t/ i2 D
, r3 W4 K7 ~' r+ d/ g" u" _- R
buf.a = pshreRAM->a;
' g8 c+ u! E8 V. b6 [
buf.b = pshreRAM->b;
# _6 a/ l4 w, d4 `) a# Q
buf.packet_cout = pshreRAM->packet_cout;
' h+ u7 s" _1 n7 K
% |( t' g) D7 c5 {+ i# q
if(buf.packet_cout != count_copy)
% Y0 I' U$ O, t p" e
{
4 q; q7 q* N6 F
printf("a is %d\n", buf.a);
9 i9 P5 F# z4 H
printf("b is %d\n", buf.b);
* h1 \: f) V) B, j8 _( ~
printf("count is %d\n", buf.packet_cout);
0 Z) N& q5 g7 v4 J0 s
count_copy = buf.packet_cout;
V3 g) r% b* ^# ?
}
7 U; c# u" m, i+ q
else
5 Y$ T/ S ^2 s w2 |; K1 \2 r+ a
{
, J" ?* \4 r7 P- `* u
printf("No effective message!");
; g- u1 L+ d$ D
}
U/ ~+ u, p: I, [5 G; p
}
7 b" a6 g1 e: a; z9 |
1 d3 V, G9 I! h3 B4 v
9 d9 w: c1 d% T! Y6 E+ x+ u# n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% P4 @: p% C. ?2 m# \8 e' N: P
使用下面代码,对内存使用了mmap函数后:
5 b! Q. _' j8 i# s
#include <stdio.h>
7 P5 ~6 M, [0 M# x
#include <unistd.h>
. I" U; E7 G( N# z
#include <sys/mman.h>
# }! ~/ z7 E- S1 s; j3 ^$ q
#include <sys/types.h>
5 g% E( n9 p' i1 D
#include <fcntl.h>
+ L9 q8 @/ u3 ~3 u# h) f, }
7 D$ a7 \& x+ Y' O; ^
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 v ^- Q1 c g4 F4 T
#define SHAER_RAM_SIZE (0x20000)
6 g6 @0 W4 [6 p p1 y; U
1 F, ^# c) B; @! J! V& H, g
typedef struct
) m5 E6 R7 J8 h7 {' o
{
/ f+ h/ g, V7 a# L: \) A) |
unsigned int a;
4 t( e) M) v% u- }9 x- Y
unsigned int b;
1 H6 H& \+ }) F6 ]# c
unsigned int packet_cout;
# m# X+ w9 x+ g8 I1 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- { @0 a" Y, b) D9 ~; p0 w
" R' d1 \! J# H- F, u" g" l
void read_MSG_buffer(int *baseaddr);
" }' ?* L7 N( @8 u
unsigned int count_copy = 0;
- m$ P# y) }/ V- h6 O9 g' ~$ e1 }
+ e. N3 \( }' b5 a7 G! t! _8 K
int main()
T, E) `! I0 T. X" ^& Z; [" y
{
4 `, p; R5 a+ B! w# E
int fd;
[+ K) {/ [3 \2 H
int *mem = NULL;
2 Q# z# X+ H! M
[2 b" l9 G3 j4 V6 A, A
if((fd = open("/dev/mem", O_RDWR)) <0)
. a( t- d9 d/ ~$ v
{
$ F; B( f+ k3 e
perror("open error");
O- x/ c0 H, z! `0 ?% ]3 I
return -1;
& z/ _! q4 a. o$ b; O, B% g
}
$ h6 T! S, }3 Q4 Y5 M; Q- S
7 d r3 V5 y$ ]* x" Z) o9 S o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- O' y( R* u1 F" j3 i
/ h. R. P2 u w4 [
while(1)
) J0 d+ n( u- l# O! h6 U! U
{
& Q. Q/ d9 i& o) N) B9 [8 n
read_MSG_buffer(mem);
- S6 n5 W: j! f' \! P" H0 C4 ]
}
1 y( ^7 J! f' [
}
( H, }2 R! C1 n# A$ U2 ?
1 \. ?) \( S# G5 c# U; j9 ]
void read_MSG_buffer(int *baseaddr)
Z4 S; v+ g9 O$ M; S/ @
{
- B. ^, r/ q I, W0 y2 @8 Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
' ^ e8 h8 E- W# D/ Z* F6 n
1 z7 \; [3 Z6 z4 C. S+ n5 v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 x2 S; @: s% z9 b0 A8 K4 i
/ B0 D+ h' e& p4 r- n; z6 g: D
if(pshreRAM->packet_cout != count_copy)
4 N" X* f2 ^* `* G( y
{
8 h( {: z: u3 G1 T* |* s, z
printf("a is %d\n", pshreRAM->a);
5 }) e+ g/ T# g$ [& B
printf("b is %d\n", pshreRAM->b);
. P; _2 L. B3 I! A
printf("count is %d\n", pshreRAM->packet_cout);
% Y# \0 f! d. p
count_copy = pshreRAM->packet_cout;
; C$ [: r+ y6 y: [5 t$ B
}
( e- n, Z! q5 \: [& G
else
* J& ~, |) F: A# K
{
7 N* C6 J, D: ~1 F6 F8 F, b
printf("No effective message!\n");
2 b) x& B: y+ h' M0 x+ Y
}
. \, }# S5 ^- X# S4 O
}
! E3 n9 `3 N2 ^/ A
6 }3 H% H6 e& y7 N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* T; @& w9 o/ C
1 S' T5 o; O @2 b) y( t
: q% p: a: p9 A5 w+ O, p( ?
y( B+ F& M; d. G& Q- T
, ]/ \6 v! u% W g& f: m
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4