OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 P4 Y; z0 z, f0 q
  x  S! u$ I" fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 y* z+ }8 V9 T' U#include <unistd.h>
  l% R1 b1 E. g# ~, k' i% E/ K#include <sys/mman.h>* C& S$ K& T# J4 u
#include <sys/types.h>/ C# P, H/ K8 O/ h7 b4 n
#include <fcntl.h>
6 t# A& o6 x" E; b6 d  l4 ^6 }9 n9 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! r! H6 R% l3 r, n  _; ~

  M0 y" F0 N0 Y4 m+ Ftypedef struct" R* v* \$ z8 U- T
{: e5 j! |& n. a! f6 n7 R' B1 z5 ?
        unsigned int a;
7 [% \+ Q5 H  L& `4 o        unsigned int b;9 B1 n$ F) X  G; Y& @' ]  x
        unsigned int packet_cout;& l9 ^7 D( Q; L+ u- x; {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. X/ E/ u/ @# e
4 _0 I5 k( A7 U4 V8 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 z+ u% s# A4 U1 S$ v3 R
unsigned int count_copy = 0;
* V+ B$ \0 k5 O+ ]  `
1 i) g0 Y& d3 _/ m0 O
1 [  p& r. n: Y. B( B+ Tint main()$ `: z! V. h7 J, v$ n! ]
{% a; T6 d" H4 A- z2 p$ |# M! y
        pRX_MSG_PROTOCOL pshreRAM = NULL;& U4 k) }$ x9 N' m
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- D# I& [8 I' K4 n5 e" ~3 Y; M
3 X" {! n) d9 G5 X2 F
        while(1)- j6 j. ^& b  f1 u
        {
  o8 ~- L* i2 p; C                read_MSG_buffer(pshreRAM);
1 \( Z! G2 n) u/ J' N5 O. I* B        }                $ s" w! B; c0 P3 m( A+ F
}2 [5 R2 E0 y. g! ?% R
6 H: ^8 Z, s) k# M* V3 V3 Q; H8 @/ f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 c* M  r& e9 L! i! |{
. Y8 m; H' f; ~, \( e3 v6 x        RX_MSG_PROTOCOL buf;
: ~' [( {! W* R; }% J" N        
9 r+ m9 S8 z* S. V        buf.a = pshreRAM->a;
$ z1 K7 C7 I' P/ ?4 S8 B        buf.b = pshreRAM->b;$ h' ~% Z! _4 `1 ~; w* h
        buf.packet_cout = pshreRAM->packet_cout;
: w( i1 {+ y) Y, @  P        3 h! |0 d4 _" F, U- Q- ~2 `
        if(buf.packet_cout != count_copy)
( M+ y+ y2 l5 B  r        {
/ F! [3 Q, _/ Q4 R$ c                printf("a is %d\n", buf.a);
# v0 H6 I' Q; q+ u9 g2 q" P4 m                printf("b is %d\n", buf.b);# @% m" j+ K$ l! L9 q+ O5 b  y
                printf("count is %d\n", buf.packet_cout);1 g7 a% w- t) }4 r: F
                count_copy = buf.packet_cout;
1 d3 w1 O- e, I        }' V2 J) J0 R3 A3 W9 k% E
        else7 ^& @3 J! V/ X4 u8 E* V
        {3 q' r4 B1 Y7 \8 m& k
                printf("No effective message!");: @0 g4 I# M5 g$ `: r: b
        }" q' I6 y! w  U. y5 v# o
}3 i, B+ h' [3 H7 u* m/ n6 E
% ?8 w0 h3 M& e. H0 L  c
: s& I8 i3 \0 L* H; B% s. f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, N# X) G3 k8 S1 ?
使用下面代码,对内存使用了mmap函数后:9 G% i# N- m: x+ |6 X
#include <stdio.h>5 g% m* v9 o1 b4 q4 n. F0 ~/ v
#include <unistd.h>
6 [/ t* @4 F/ J2 p; S#include <sys/mman.h>1 O5 U( z0 ]* N# e! D$ _, a
#include <sys/types.h>0 [4 \5 ~! X: E0 _! b' `
#include <fcntl.h>) a  n& W4 \+ a; }
; S* v/ m( ?/ s* v6 I$ k" Y0 b
#define SHAER_RAM_BASE_ADDR    (0x80000000)
; S& p2 T% a% a. X: N#define SHAER_RAM_SIZE         (0x20000)   + c+ u8 C; i1 u' q

7 T6 V$ ]" `0 B7 t; y* Atypedef struct8 t: [2 J" q4 c5 u: z& O- m7 A
{
; H$ I% |; I6 r        unsigned int a;
, p2 C$ A' N. s# @! j! w+ G        unsigned int b;9 l: n7 }9 k- A$ @
        unsigned int packet_cout;, S  X1 m2 g. ^: x% ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& I, Q) Z2 v/ k  j9 k3 W' N# F. K6 {
void read_MSG_buffer(int *baseaddr);
" Z' p2 |. P" a' ~9 `/ l! f% a" y; Qunsigned int count_copy = 0;/ W- ?/ D6 X0 ~
! B) I9 y8 s7 G0 E* ]) f- s
int main()$ V/ _* T& C) I) l- ~
{
: @8 {2 @. ^% P/ T; s        int fd;4 u5 Q+ N4 b0 F: i
        int *mem = NULL;
% e8 X" }2 w' j* w, a, Q) x! z" L) d  n! u
        if((fd = open("/dev/mem", O_RDWR)) <0)
- Q- R% }+ @5 P5 ~3 A& Z% `        {
; h& D5 s! b, p6 x. V1 T- g, A                perror("open error");
. F  k8 |$ n9 s# k% c; T4 y* A  \                return -1;5 p8 P/ ~0 \. t2 h
        }; q' R1 D  d- p" L
        ( S, m% V* U9 I1 m
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 h4 z* t- {$ B2 i: B" ~. D( `/ Q' {. \2 F4 G0 [" X& }$ S* e
        while(1)6 P4 W, k1 ?( T  Y: V# b4 q
        {
/ u& D, Q) t1 ?9 b0 U                read_MSG_buffer(mem);
( i) w: D# r$ V) \6 B' s8 g; \        }               
  M9 K$ i+ v; b- U}/ z3 H1 W' F! f& C

( E& |: @$ Q. [9 ~0 x( m$ \void read_MSG_buffer(int *baseaddr)2 M6 L3 U+ p4 K: x2 g# H1 G/ Z
{) ~4 V) y( R! V- P8 h8 d
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# R: J3 H6 D$ R" l. P2 i% z& [1 I8 U" g6 U& V7 H
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 J7 c7 S* f% w2 U! r6 K5 b1 |6 k+ J5 c1 z3 v0 m* u
        if(pshreRAM->packet_cout != count_copy)! R2 b) H- H% H2 h0 I0 r, T0 E
        {: v/ {* L% x4 L0 h/ g, V, k
                printf("a is %d\n", pshreRAM->a);* ^1 o6 D) F% \( V/ V( d, }
                printf("b is %d\n", pshreRAM->b);' z3 ]/ }8 [- A8 B  M; }/ c
                printf("count is %d\n", pshreRAM->packet_cout);
% P8 d3 c+ v* X3 A( _. r8 T                count_copy = pshreRAM->packet_cout;2 u4 a* U* `; K8 r, C
        }' b+ g+ _! y, G: Q. @
        else
0 I+ P' R; y; j- u' Q" B        {* |2 L  \7 u3 W/ {' c* d( y. R$ m
                printf("No effective message!\n");+ |% T2 C, R  U- v2 X
        }( g- |9 Q; a6 h3 ~6 X0 k7 ?
}; q$ i" I* w4 g
! ^6 q5 ^3 ~3 g7 J! F& n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' b, A- h7 t. C, \7 K
1 P/ N: x1 X; t. N& y( Z: ]
9 `. ~3 i5 D( H# t2 ?

1 k# l9 q1 p0 R6 k! o" V; j8 c# g2 o& I0 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 12:54 , Processed in 0.035913 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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