OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5567|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ [: @6 K1 t$ j$ ~
+ z  C& U3 ^! j2 b) A( xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, h0 `  [5 F0 P, q  g, W! @#include <unistd.h>
- p  L& u& s. K7 j+ V! G#include <sys/mman.h>9 d4 B. ^% h8 `* W5 s$ J$ J
#include <sys/types.h>
1 z# X# b) ?+ }- v: O#include <fcntl.h>5 K: J# s+ [/ A8 u) @# @6 M* X( E

; @! R$ p: w2 a- @( @! P- X3 E#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& k0 P6 f8 X* F8 f/ Q* E) ]: T5 V+ F, ~% a  ]" i2 W
typedef struct) ?+ o: e, }/ S1 \
{% e+ i5 _3 ~$ n9 f: H" N
        unsigned int a;( v$ n: [! m: P% K7 n9 E- F
        unsigned int b;
2 m% z2 w0 H, l        unsigned int packet_cout;( e  [+ H9 J5 P1 \% i& d; K% a, N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 u, d/ Y  e: `8 b
+ \+ A7 W. z4 d! M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ w+ Y, o7 @2 @( n( t7 cunsigned int count_copy = 0;) L' ?- A, k; Z% s4 W: ]) N
2 B& [9 O; V( `+ {( \0 r2 V

4 y- ]2 o, Y! oint main()% k: `+ f/ l$ I% G
{0 `  D; H8 Y- g" |1 ], e8 g7 y
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 G- Q* q: C# |8 m% b
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  h& e7 _& [9 q/ \
! {1 p8 M# T. m: B9 L# }3 v' [* x- i        while(1)
# @1 B" B2 _5 B' m        {: o+ m) P6 k9 I7 i
                read_MSG_buffer(pshreRAM);
  M, I% h8 G7 U) t9 |! t        }               
9 J! h' j( M# v}
/ S2 a+ m1 q2 b' E6 \  k) _# t6 x  u+ U5 N; p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 `* S" P( ?0 q6 M# t{/ S( T3 ], ~3 B  i+ S
        RX_MSG_PROTOCOL buf;
! H: G7 s6 t* a; A) |        / d5 s. S& T8 w4 [* m$ o: Z
        buf.a = pshreRAM->a;5 y  Y7 f: O: |4 b9 ]4 v/ f
        buf.b = pshreRAM->b;
/ K) Z5 z4 x# m( e* v        buf.packet_cout = pshreRAM->packet_cout;7 h2 c: x7 f8 i! w4 {+ B. t7 e1 g
        3 K+ c; H: ^) U5 u
        if(buf.packet_cout != count_copy)
7 @4 K, M4 P: S/ [7 z& ?( _        {
# S- J% F3 f) {. X( g                printf("a is %d\n", buf.a);( w" t* x( Z4 N: j
                printf("b is %d\n", buf.b);  b5 L) v) p$ o( B4 d
                printf("count is %d\n", buf.packet_cout);. N5 n' E9 }9 t5 C  K- l8 k
                count_copy = buf.packet_cout;
$ P  N8 N' w" [" ?9 G$ z        }
0 W5 j3 U# H' u+ q2 H7 G3 T        else" V9 y4 a/ s. y( x
        {% R7 V$ s7 N9 o
                printf("No effective message!");' T" u% J* m9 c. m
        }- ~$ a# x5 F; O. P' T
}
- ?( N- n& m& q6 r2 n- h, x' M4 r5 z/ J5 z  L6 v

& r; f/ m" x# J, Q+ B9 l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) P/ z: T! H  G9 d' W. l) M" h
使用下面代码,对内存使用了mmap函数后:+ c( x3 _; ^9 k+ O1 \: s- X
#include <stdio.h># W* d4 \9 ?; G5 v  I
#include <unistd.h>" t4 ]8 @8 [8 @
#include <sys/mman.h>
/ j$ T) u9 a5 ]  r2 `#include <sys/types.h>% p# K$ j3 T- U. K4 D
#include <fcntl.h>0 s8 A3 q* u: y# N8 }5 g# n
2 Y! z5 ?. Y, g( A* b* N# p
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 A4 L' q0 J! _; |
#define SHAER_RAM_SIZE         (0x20000)   
. r5 C. Q. p7 U9 }$ H
4 M5 [6 G) w; Ptypedef struct; {7 D0 [: Z8 h" e+ k# r2 @
{) C3 N! W/ u# y+ t9 S
        unsigned int a;! A& U. q% x4 g' k, \. |% E
        unsigned int b;
3 t# q0 n7 a1 P( Y3 F4 H7 x1 P        unsigned int packet_cout;
8 F' j1 h: B5 r( J' |5 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( g0 y. a3 d: j' R& }. N
7 C. G& n3 ?0 ]# `7 k8 j
void read_MSG_buffer(int *baseaddr);
  x0 l; |& u( y/ }unsigned int count_copy = 0;6 d; j% s9 D, [  p

& K3 f3 Q- m+ S( l; }int main()+ _( m- P4 {7 m
{6 k5 k, ]7 X+ \4 P
        int fd;4 r: q# J! t* O! M4 ^& m
        int *mem = NULL;3 ]# [1 v$ x5 y' _9 m/ \+ Z9 K
. H9 V) A2 N" g$ |( z) K
        if((fd = open("/dev/mem", O_RDWR)) <0)
# G# S% G( m) D3 H        {  D, d3 n* s" U4 R- [/ L
                perror("open error");) U7 D7 r% [( H
                return -1;
8 d  r/ c$ S) _& S0 S( O% o7 |        }
7 w  L9 s1 K# D- ?/ j8 F6 V        3 Q" C' Y8 {" n: [2 K0 _
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ m' G  k& w/ O8 u
3 [4 p) h! F( l; R# h- t6 x" u1 k        while(1)
# ^& c8 m' g# R        {
9 m1 [3 _- C% X3 c% [. E# v                read_MSG_buffer(mem);
! ^2 Q& N& `* u5 `, E( r; Z+ R5 ~8 E        }               
! @7 |, Q) h* q}
) I  l2 g/ m7 B: N5 F& Y3 D7 E
) k8 S/ B% e! cvoid read_MSG_buffer(int *baseaddr)
3 w" j! A& @, e7 ^{4 {9 H7 C$ U- ]: }* \" x
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' p$ u0 l$ M$ ~' v  |
# y6 f1 e9 I9 L8 h; K        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 Z  t1 R2 ]. k9 r, |
# w9 y: k# r4 x; x6 L        if(pshreRAM->packet_cout != count_copy)1 X$ _/ x' C: f
        {
( o% R9 M" Q4 U! S+ q9 S                printf("a is %d\n", pshreRAM->a);0 I) v- |8 w- e! p) }! A
                printf("b is %d\n", pshreRAM->b);# w; K4 P! G0 w. A5 I1 P- Y
                printf("count is %d\n", pshreRAM->packet_cout);: L  t/ o# h/ l' T1 p1 X
                count_copy = pshreRAM->packet_cout;" E0 m. E1 X! p
        }
9 V1 ]( n4 ]* m9 v7 _1 j        else
3 O; K8 Q( U% ]6 i- d        {
1 o0 ]8 t# F3 x) L3 d                printf("No effective message!\n");
! f/ d/ `6 b, O) A2 X' N8 T8 q* f+ u        }$ L* }+ z! F) J, J6 }  _
}1 {9 p& k9 G/ K& L2 u3 b

7 ^9 q/ m, P1 C0 A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% q4 f: |4 B. P& G$ q
5 C+ m# t* T. ^4 C  l9 ?
6 m! y/ |/ I$ r  a7 J8 n
/ S% G6 @- [* Z+ L9 k) F

) R2 G* _) a& D  B; ^) V' H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-1-30 00:58 , Processed in 0.044146 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表