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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * |$ ]2 a1 T. W" _" ^/ w; R

/ r! \6 o5 Z6 GOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. H$ E# T# j% m* A* f+ X/ g2 P
#include <unistd.h>2 Y2 q, t9 F" j1 Y' r: G* z1 C# d
#include <sys/mman.h>$ s& H* O  B3 U1 Q
#include <sys/types.h>$ i$ ]- G+ Z2 R9 U% O  n
#include <fcntl.h>
. {; f) p4 I+ {
1 z: r: I7 s# a( O#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, T4 u+ R3 `. h3 K& C" m% J9 i& _) F3 q3 _( C& \/ o: U3 H
typedef struct# @% d% n& ^2 ~5 m/ h8 c" M( Q
{
! T9 |  w$ n. {! @        unsigned int a;
- O5 `5 L4 L, y! c- o+ v( I" U        unsigned int b;3 q! z: M! q. f% e* e- \8 K' n
        unsigned int packet_cout;
3 V2 j8 Q! P: h' L" G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: {# v; s2 z6 K$ m2 }6 Q0 Z8 S

- N# l( ]! [7 D4 z/ F0 w9 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 E1 V% U1 [% }3 n0 a. uunsigned int count_copy = 0;) N) [5 B/ M# ]! R& m
! H; m9 @" E, o! h) s& M
4 b) A6 A8 c4 _
int main()
9 J; ]4 k) j& J{! x# t0 K) u7 w' l& c. O
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) [6 k0 K' t* R8 ]8 f; Y  a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 v6 ^; K6 \: I1 z" @( x$ W

( h8 S! r3 `. W0 R$ `% M        while(1)1 a0 y  u" O* \2 D, D$ g( k: l1 O: h
        {5 @. F: t6 }1 F
                read_MSG_buffer(pshreRAM);
- l  b& O0 ~  E1 l( s- p% c9 ]; f, j        }                : ^& X& {6 y2 j: T5 L5 Z0 _" Q% q6 i1 f
}
+ a- W8 ~2 k  N( q3 h% |
2 e" H6 l4 N# Z# ]3 M6 N! f1 Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 U' x! A1 x: Y* \
{: |; Y  L& `0 n' \8 I3 S; E
        RX_MSG_PROTOCOL buf;1 @4 }% i0 m, R& K5 w0 u
        * K: N! _8 j: M+ q: h
        buf.a = pshreRAM->a;( f9 Y; q  Z) q0 }; f/ V& W. D
        buf.b = pshreRAM->b;
: M' X6 p6 w- e2 s        buf.packet_cout = pshreRAM->packet_cout;. x# B9 f- A" x
        
( k7 w4 k) G  R/ n. Q* {1 m# K        if(buf.packet_cout != count_copy)
$ x& @! c3 A3 G- p2 b, i: {' E% m+ L        {
0 r" M, V7 [9 D                printf("a is %d\n", buf.a);
9 s( I) ?/ w7 x7 J% b* |* F                printf("b is %d\n", buf.b);$ G. z; q2 h& k
                printf("count is %d\n", buf.packet_cout);- p* M0 D$ t% q) T+ t" h
                count_copy = buf.packet_cout;. R/ k7 X7 T, z& L, @" o. I5 i1 S
        }
6 _/ T; v4 Y  Q) N9 q        else
! X: R( G0 i1 T2 U" e9 x1 @        {" P# \4 ^/ J9 V" m' h% }
                printf("No effective message!");# [3 A) |* E8 x: `) J. v7 j
        }
9 C  x2 A" Q1 J" {; y}: h+ i* [' o3 R( x( R, {% z# a! m
$ L/ K& S5 R) g. f0 h2 x( [

; i  c& D# U6 C/ @但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  I) V1 U# l9 A8 D使用下面代码,对内存使用了mmap函数后:
: g2 Z, _! }$ Q, X4 r% r6 N#include <stdio.h>& W; M' M5 ]+ K" u" T; j" d
#include <unistd.h>
+ T/ ?2 F  n, c#include <sys/mman.h>
' S0 @% \( o2 o4 r#include <sys/types.h>0 {9 G; \& c  C! |8 d9 y
#include <fcntl.h>
! d) e6 r. \4 q% |9 \+ N# B! \6 U$ P# @2 z
#define SHAER_RAM_BASE_ADDR    (0x80000000)
; Y1 J+ |1 X# N3 ?" K#define SHAER_RAM_SIZE         (0x20000)   
1 S9 e+ q# x* _5 l9 i* W1 ~
2 ^8 r- Z( E8 Q) Z" Jtypedef struct. K4 R3 }" N7 X- e* `
{5 F" p) B' f, o, A
        unsigned int a;
/ d$ c/ i1 G" {, s- C        unsigned int b;
2 ^5 j0 j+ v( M        unsigned int packet_cout;
) b4 l& Q  K2 L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 W8 ?' d9 f" I( l, o
6 O* a; w5 F; [4 f9 ~void read_MSG_buffer(int *baseaddr);
, p0 V# b9 O- ?1 M9 `) v) V1 c' Qunsigned int count_copy = 0;
3 _" `* v) J1 h3 g' i1 q+ c
) K2 V$ F0 I3 E9 P% Oint main()& t0 J3 T9 Y$ y8 ]+ d
{: r- E6 ^+ X& X
        int fd;
  T) a6 o# o& ^( Y" h        int *mem = NULL;
4 n  B$ Z3 i# _& n4 u; k1 q/ r& w5 j2 o. J
        if((fd = open("/dev/mem", O_RDWR)) <0)
6 D- Q6 t' z* r0 s! E7 y: H$ Q3 \5 m        {* @7 E# X' n8 q. p* a
                perror("open error");' ~$ G" S! H; r1 s- n$ p0 L
                return -1;
+ B: ?2 _  O& Y: s& H2 l        }2 ]$ M4 s( w( V! _9 r2 g
        
; T) {6 H8 L% s3 ~' s        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ T1 W# T& Y# C. E  V0 x; j6 k6 m; j& {, I7 ~6 j8 Z3 L
        while(1)
+ g% l, ~7 I* d& v$ b        {
$ s/ p+ ^* ^$ I) q, b3 S7 ?7 W. L                read_MSG_buffer(mem);
4 A% l# [/ y. ?5 p# }$ a% Q+ O; _& O+ z        }                ! C0 k7 m6 G% o; y, p$ y$ P$ t4 ^
}; ?( |; D3 V/ j# B4 ?

! X7 |. l1 p$ y9 ~* Gvoid read_MSG_buffer(int *baseaddr)
& z% G. _7 w# @! @3 ~/ E8 y. m{
8 N5 y* f6 O+ [3 b! S        pRX_MSG_PROTOCOL pshreRAM = NULL;0 D2 U) {  s* ^1 B. U, a0 D  D

4 Q! J1 K  U5 f; F0 i        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ b, ~# [. V- q: _) p0 N: ]6 x
" i) J- t6 C6 E9 o) J9 }8 M* \7 ?        if(pshreRAM->packet_cout != count_copy)1 [" w; E1 G, y! |
        {
0 w/ V) p/ S9 J0 T                printf("a is %d\n", pshreRAM->a);& ~+ {# P: J$ I& Z; V. h; J
                printf("b is %d\n", pshreRAM->b);
8 Y' i- x( X5 C                printf("count is %d\n", pshreRAM->packet_cout);& @. Q+ C$ \- _9 ^& H7 o% b" F
                count_copy = pshreRAM->packet_cout;
6 _" T- X4 W0 [$ a: W' [) T        }. b' y- t: v5 O# Z, x
        else
8 H2 B" ]2 [: w) ^+ n        {
9 y: _7 n! _, l                printf("No effective message!\n");- A! K6 m$ H: z
        }
. }8 K# A: B) X- ]}( H0 M. A  v, _( O
* b; n9 J% u5 i' O) a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 E9 i' R2 P) l
) a8 n* A: A2 C3 e4 G5 n/ D, q: K5 q
7 Z# N! o5 b) n1 [' q8 C. i( k7 F

3 a7 y7 p6 W2 T1 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 04:37 , Processed in 0.039885 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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