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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 x! v6 t, d( r8 I4 j( v- O8 p1 S1 H6 D5 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ C  v) _5 p4 s# C- W) b8 x" n#include <unistd.h>- _: T, x/ @+ z' T! [: ~# z
#include <sys/mman.h>
/ p- w0 [) }& |& e#include <sys/types.h>) x% g% I* C0 g: W7 X# z
#include <fcntl.h>* t: H. D6 F. [/ `
5 b0 B7 _; Q& L: l5 ~  H
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 u6 v8 A6 ]0 u& |: [0 X/ H  Y5 s+ W+ ~) B$ u9 |
typedef struct
  w. M- Y" K' [{4 ^1 O$ _' }( I% p! ?/ e% D" U
        unsigned int a;; _/ m9 ]1 N, U- S! I
        unsigned int b;
2 g# P1 p+ ?# B& _        unsigned int packet_cout;
0 Y9 a" i3 g2 L2 [1 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 a0 m4 K' |- V1 F" P
- _  N3 c7 {) V$ D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' W* U3 X6 D" L' ]. y' Funsigned int count_copy = 0;
% F' m. w( u. n" ~, c6 K9 ]& t. j, @' s/ q3 \# g
+ \* A  Z9 X, C' x3 S+ @" U- v
int main()7 [9 E4 F# H$ w# P
{( ], _! F/ w) E# g6 s' P
        pRX_MSG_PROTOCOL pshreRAM = NULL;% J4 n4 ^- z% c* W8 ]6 g0 P
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# y0 m; G' ]4 w+ \) v) \

: _: {( e$ c* x. X/ z; T# u+ y* f: B        while(1)( d: i% r/ o/ `! Q
        {# h$ l1 Z' p* k8 j
                read_MSG_buffer(pshreRAM);: l1 T- {& G0 Z9 `, Y4 ?7 _( ~# G/ P$ }
        }                * L8 k  H' q/ b1 w! \$ t
}/ p* [% D* z/ J0 m' E

5 _# H6 W( m8 X/ {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 p. N1 }7 I. q* e3 @
{
' Q  s2 c6 m9 u8 z        RX_MSG_PROTOCOL buf;
4 i: @* I5 F- x. i        % r2 I$ M  M% i" \
        buf.a = pshreRAM->a;
* s0 ?% R4 R5 g$ V2 x8 m% }        buf.b = pshreRAM->b;
! }2 j6 ^+ u) X2 t0 \) O" ?        buf.packet_cout = pshreRAM->packet_cout;) ?6 D0 a8 O& K  a
        2 X5 `; R/ Z( u* m% i9 T
        if(buf.packet_cout != count_copy). G8 d" m( m- V
        {
! X7 h2 U5 {! ~  G                printf("a is %d\n", buf.a);2 ^$ s. r; o5 x+ e7 A8 n
                printf("b is %d\n", buf.b);
% L) z7 ]; y5 N% o2 V                printf("count is %d\n", buf.packet_cout);, D/ A7 ?* q9 T0 |' ~7 U# f
                count_copy = buf.packet_cout;
* x# B, ]4 f& x% E5 D# s        }5 {+ N. f+ q" F, p9 k/ v4 Q/ X2 O
        else
+ \  p6 m  b' M) R. e; N, \        {
4 N1 ]0 m2 `, y& @                printf("No effective message!");
. z; e5 b0 }9 K! {  p% E        }4 l. A8 H' Z5 A5 N( ]% D) }/ z
}" V. y$ j4 G2 r3 j' Z

- n% r" o9 l' c: w; o4 {0 Y* L- P" I, v& K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ ]4 e8 d, l; {5 p使用下面代码,对内存使用了mmap函数后:
1 C+ P; E) ^* ^#include <stdio.h>9 o' T$ p# s1 u/ y' Q" o
#include <unistd.h>6 [3 S3 m! l) O9 B$ [$ g5 G
#include <sys/mman.h>3 w" J* r/ K* y8 p7 o$ F1 w
#include <sys/types.h>" n$ D1 \- [0 j7 M! b( B" R
#include <fcntl.h>
8 |# y% t* O, f  Z7 B" [6 _/ i) b2 \7 S. Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)
) M9 T% |3 P8 Y& W9 Q#define SHAER_RAM_SIZE         (0x20000)   
/ g, s! P' S0 |3 f) x4 {
  C1 W$ ~, @+ L0 T3 N( |+ P4 ntypedef struct3 D0 @* K; B0 I; q/ e" s/ ]  U
{
' D7 P4 W. D1 _0 r1 I7 r% f, C        unsigned int a;
& H0 G$ h- ?. K+ M& [( J        unsigned int b;
% c) l1 |" c9 |, ]4 {        unsigned int packet_cout;6 `2 ]9 [" X8 c! N; |1 R. |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( M: H/ a7 J# d' x+ w& m0 c  _/ ~4 h
. ?% N7 U1 L8 k3 O0 D0 p- y: l
void read_MSG_buffer(int *baseaddr);
% M( ]0 w& ~, s* _unsigned int count_copy = 0;
5 K' \8 _. L8 D; e% h7 y
, P: ?* w  @& E6 rint main()  u1 V$ a3 J" {0 a, D
{
8 U8 S+ B, m) {6 i" Z0 o) C        int fd;
: F2 C  ?- E/ G* x) g: g# v; X+ L: ?+ V        int *mem = NULL;
8 `: Q$ h9 f5 z8 T2 o8 D9 e6 A
1 u$ u  u( l& u% S' b- Q        if((fd = open("/dev/mem", O_RDWR)) <0)- R& [6 }- ~8 Q# v# a+ z
        {7 U$ @# B9 _; z( {& V
                perror("open error");
9 ]$ J7 A3 }; Z4 t. S% u+ v8 V                return -1;- ?# n8 S2 v$ |/ _
        }( w; O( u2 M- B. K5 o
        
. q  o9 {6 B" t  o2 `1 t        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( N/ x4 a4 B* h0 v: G* T5 v8 F3 P' X8 E
        while(1)
) J8 u  T* c" d3 A        {
/ r- Z" _% m* J  A# Q# Z                read_MSG_buffer(mem);
# k: q2 \/ c" r: M! b; F) ?! T        }               
* p0 [) f% l, _% l9 W$ h}
6 w  p1 q. C* _/ y. j! d" V6 \4 ]6 f5 M1 w% A
void read_MSG_buffer(int *baseaddr)  `0 z# u9 a: [1 ]2 w/ Z! ]
{
$ E8 c3 X  c3 V0 A& ^  }- E" Q        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 K9 P1 X0 r. Y3 U# ^& H- f" s0 }: O& b. `3 |# o( e2 I
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 ?: R# R( d, q4 d/ e& ^6 {) i" ]
' H" z$ {3 |7 E7 g% a  ^
        if(pshreRAM->packet_cout != count_copy)$ y# d; n" F( O. v. r5 x. w- u: w
        {
/ w- r+ u4 a/ C; A0 y2 {' p                printf("a is %d\n", pshreRAM->a);/ I. m" C% u/ Q( c: n
                printf("b is %d\n", pshreRAM->b);/ n+ l3 K) B% `8 `0 e  }
                printf("count is %d\n", pshreRAM->packet_cout);
& `( S& F( C! \                count_copy = pshreRAM->packet_cout;
7 }3 x) Z( y! q1 U2 M0 E* `        }
7 f" b; {2 w% t# n& O/ T        else
; ^- M$ e' O; m9 F; _. ?) H        {
2 E, d$ J) l6 F" @$ b) t$ p                printf("No effective message!\n");5 F& S# i$ m' O  G
        }1 b0 `& M2 ]; U0 W5 o+ Q# a
}
3 Y; F- _  n9 m3 R- I" {* r3 G/ }# h# y8 f1 V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 x2 @; n9 W: O% n8 B/ ]0 d1 N) f
) }& `6 M& u9 K

, H) l1 I/ ^* \, j7 r0 E
8 v0 i7 W" V, ^1 t4 v0 A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 00:00 , Processed in 0.069337 second(s), 34 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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