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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 M& D+ U/ G! f" j: h5 R* ^% `
5 N8 A. I. ]$ O- s* B2 q7 M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) K+ u: }  V' c, p* a
#include <unistd.h>/ R8 y# @6 J- h% |
#include <sys/mman.h>
  Y" I/ c& Y) p: @; _$ U- j/ r3 N#include <sys/types.h>
1 {3 f+ J& }* \, c3 [6 X2 S#include <fcntl.h>2 d: h; @; m' ]$ z

: o' Q# p& P, x' l#define SHAER_RAM_BASE_ADDR    (0x80000000)   - f' z% W  q3 ?/ N
& @5 y5 \/ _6 L% }! w4 n5 Z0 H
typedef struct
0 v5 V6 C6 g  U$ P  }$ \{
: T/ l' q" Y: a        unsigned int a;7 ~& X- p4 d6 I, ~. ?+ m0 |& O
        unsigned int b;# h# Q) V$ Z) G: B7 b
        unsigned int packet_cout;
/ W4 h  \2 N3 W; ^5 m+ f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 E0 ^. ?- n0 N% \, ?' b
, q' e8 p5 V5 D  S% _* M3 _4 I9 O; ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# X9 j9 I: d. f8 I
unsigned int count_copy = 0;
# G  u3 Q+ J; i0 I5 U! p4 x! A4 ^1 a

+ o" J, y" K/ X4 A' h6 Kint main()- e. z( u4 b* q) t3 M
{
  O) m+ I6 D6 m* A9 l3 y        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 u  Z/ o$ U, }4 P$ i% D2 B' G" M        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: N1 Z( J& x( e8 m; |, H9 r

% k, Y) i* y4 B/ q% V; c" U        while(1)5 f( e/ y/ r1 \7 b2 f
        {& b5 {$ O/ l* n. d+ }
                read_MSG_buffer(pshreRAM);' T; M: b" c1 A7 a: }7 n
        }               
: Z& O$ N2 q! i* f}$ e6 y( f( v1 T& [3 F1 L
7 Z% T- I6 ?( Y4 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- k% J  s( z5 G5 p. D{
. o* N; p+ }+ |, _; H6 N( _        RX_MSG_PROTOCOL buf;
+ B) ~$ M3 d# O8 y# V0 R        
$ Y1 Q1 ~" Q6 t8 o; }; |6 O5 j        buf.a = pshreRAM->a;+ |4 z/ f3 a; T) W
        buf.b = pshreRAM->b;
, h; c; d; Y* E; O7 r2 p8 q        buf.packet_cout = pshreRAM->packet_cout;
3 V/ R2 e$ H; M+ m        ) E/ |" }8 ~4 j" J- i
        if(buf.packet_cout != count_copy)
1 H0 k6 W7 J( ?( x; @' q        {9 N  k3 t$ t4 l% a9 a5 b
                printf("a is %d\n", buf.a);
" {% n6 f) ?' c2 u3 h                printf("b is %d\n", buf.b);7 J6 Q: ], _2 G4 u: [
                printf("count is %d\n", buf.packet_cout);1 H: I9 X% t& J' Y
                count_copy = buf.packet_cout;) o& O1 K5 C% M! r) }4 h
        }' m7 z& F# [/ A  ]; l! W
        else
, j5 \/ ?% t6 @( ~" c$ M: m1 U! M        {' p# K2 J6 u" \5 D
                printf("No effective message!");
) B1 v3 Y" L" `+ s, w! g, l3 v        }9 j0 R& J7 Z  ^/ q5 }5 O9 x
}
7 S; [& m2 S" D! w2 V9 D7 h! O$ e( B6 Y6 ]" V1 D, ^4 k' P
0 v6 ^6 n) m7 a9 B( K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 D4 p& `5 k& X3 _1 ?3 e
使用下面代码,对内存使用了mmap函数后:9 o* I) s0 L0 K! d# q, ~
#include <stdio.h>+ j% X$ C  Y8 R( J: P9 g% Z
#include <unistd.h>
( Z% P) e9 w& E2 }3 ~) Y! ~' L#include <sys/mman.h>
9 z4 d( Y* b8 l+ j& Y% Y9 T#include <sys/types.h>
1 w: S! ?# W' V! T4 {" G#include <fcntl.h># q0 h9 @7 C2 I( y
' b# `+ u5 D# n. g$ l
#define SHAER_RAM_BASE_ADDR    (0x80000000)& T9 v. A( I% E1 a" u+ E2 X0 [
#define SHAER_RAM_SIZE         (0x20000)   
* R# V+ @' k& L# p# X
; E3 X+ l" w! b9 _typedef struct
9 d6 j4 U+ Q8 a9 W- C* Y{
4 c3 m. c5 t; X$ y5 l5 E; ~+ F        unsigned int a;+ P5 a1 U: ]/ D1 [/ h" u
        unsigned int b;" U$ q7 h! O7 ^; `8 B
        unsigned int packet_cout;& E7 j/ C. y. x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 \" r, [6 k( J/ X6 r
( M7 B+ ^$ Q. L+ p
void read_MSG_buffer(int *baseaddr);
$ ?2 X# ^* o8 P) s; v) ^8 H  Q9 @  T( Cunsigned int count_copy = 0;
3 K# _/ Z" Z9 ?) h- E7 A# D" k0 e0 X9 p+ D
int main()
; O5 J) c* k& M, y5 ]{9 t& W4 L# K; G: v) G
        int fd;3 d1 {. R8 Z4 M0 u# y5 w
        int *mem = NULL;
' v6 Q0 m: X2 p6 A
5 S7 ]( A5 l% i        if((fd = open("/dev/mem", O_RDWR)) <0)& _7 ]% J4 y6 n
        {/ r- H' U" ^; H* U
                perror("open error");
! ?4 z  j9 G2 x2 c: J. E                return -1;0 h: L8 }3 g8 y' {
        }
9 J4 e9 L& D/ A        , s4 i& i9 p2 |/ U; l
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ n8 t' J: n2 R3 y5 r
' h# D1 ^6 z) I; y# b
        while(1)
7 k" E- c% ?; q6 R        {! T/ u0 s0 v, s$ d
                read_MSG_buffer(mem);% ]7 M" U: ^) t  Y; d2 p
        }                $ a+ y% u: Q8 f2 i+ [, W
}# C0 p/ a* g+ G2 U- v

8 e' D) E; w$ ]; P+ A1 _void read_MSG_buffer(int *baseaddr)
$ F3 \! ]1 l1 b6 A/ X+ C{
: x8 Y" b3 z; q- m        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 z$ j" Q/ l9 o0 x4 q" o5 x6 T( y; w) r& l& Q" ]$ ~1 ]5 J) P- i1 N
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: c$ O1 a% t/ k' @! R0 F) y% |

3 o: _4 j/ F3 e        if(pshreRAM->packet_cout != count_copy)
9 G8 m' H, |* L9 `/ L5 }; C        {
$ M$ }& f. f" q' E% Q* d: |8 r7 M; d                printf("a is %d\n", pshreRAM->a);  h7 W) f, X) r$ e: V
                printf("b is %d\n", pshreRAM->b);; G) @( p( m: T, S( @! L: b
                printf("count is %d\n", pshreRAM->packet_cout);
: a+ o; u$ }/ G2 T' ?6 r                count_copy = pshreRAM->packet_cout;) z- Z8 [+ K+ D& Y- e6 ~
        }
+ q3 f8 a, ?3 O2 v, Z        else* C5 M+ R; O- q& B* ^- H& `+ z# r
        {/ P* K& q" k4 l
                printf("No effective message!\n");
4 y. o  b- }- N/ k& p        }" W, j6 R' Z, c1 I9 K0 ?1 e# A0 H
}
5 p& }% ]0 a; R% y3 C2 s
1 e  ^$ }2 G; L+ `, d# [4 b0 m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 Q* }% R9 r: u* W9 W
, w* B2 Q' q0 F; |1 v9 b5 n
: c8 R9 T  l4 }3 A- \: [, z8 g) U" A( q# J, F9 r2 k
$ k3 o9 m' _+ t8 G  y$ ^: }0 c) d: [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-13 00:27 , Processed in 0.040329 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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