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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & i6 V3 e5 ^6 w5 u  q/ d

% X( A$ L5 U4 g- YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ o3 I- ?- ^" z2 _#include <unistd.h>
, R$ R3 V  d/ t# e. x#include <sys/mman.h>
9 V" _" n" W4 F, v#include <sys/types.h>
! |! N5 c# i, ~) c9 `4 `#include <fcntl.h>% f6 w" Q8 w+ ]9 ?: L3 W  U
" D/ }( \* D9 o
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" s! ^6 V9 d. H2 c
. b4 S( @$ A1 V0 I- s; R4 c, w3 Itypedef struct1 S" s6 K6 C0 Y- b6 W2 x  @
{
' L* n4 k- }# ?$ G- J) o        unsigned int a;
" T) A$ z# e2 g        unsigned int b;  t: h" _5 V$ }0 J: N
        unsigned int packet_cout;4 b" V" F: q# P' @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 _% I: S3 h5 _4 W9 f
  y8 Y6 _! K, |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" G, W4 X, O/ D" ^5 I) j5 X$ ?unsigned int count_copy = 0;
5 `1 l/ T6 ?) n: e* l# x3 x: t. e+ _" x8 P

9 O9 q& i2 W5 d, x/ ]( yint main()2 H: J% H" r/ Z, H
{
1 t( `9 L) x8 f) t  e* g2 `        pRX_MSG_PROTOCOL pshreRAM = NULL;( N. ~% {5 G! ^/ r2 Y5 `7 H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! f9 ?2 A: K3 j0 }( [/ M/ d4 n8 ]7 a
        while(1), @; A7 ^; i  ~# |; n( f$ w; v
        {, J4 B% b9 E' C$ a
                read_MSG_buffer(pshreRAM);# d7 g6 Y+ A4 j6 e2 c) n! F
        }                - Y4 U; U$ B0 L  \, \
}
  h% B( `0 {  k5 u0 Q2 }
8 V2 k' a# j1 A2 _0 g/ U2 s, Q2 J0 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: T0 J  S# G" Z$ C* n{& z9 L% ?" c+ M! K$ \6 s
        RX_MSG_PROTOCOL buf;
/ n6 S  u- O, l8 [" z& Z        
3 a; D% ?6 D+ ^  A        buf.a = pshreRAM->a;0 I/ H3 Y4 f( {6 S
        buf.b = pshreRAM->b;
9 r1 D0 h$ A: n- [6 n        buf.packet_cout = pshreRAM->packet_cout;
. u: Q& x9 W/ d+ L) d        / \8 T: K7 R) U0 G; N: R0 Y. [3 w! f( M
        if(buf.packet_cout != count_copy)# e: A$ C  a7 p4 v# d! K
        {. U3 m, a6 b$ f4 b3 S
                printf("a is %d\n", buf.a);! z: C8 k4 E7 F4 T' ~) C
                printf("b is %d\n", buf.b);  u1 k8 n/ P4 R8 X4 }1 s
                printf("count is %d\n", buf.packet_cout);( l1 u) ~& Q$ b4 E7 G5 Y, k
                count_copy = buf.packet_cout;, f: z/ T. ]5 N
        }+ I; u1 M* ~; k0 O8 H" \- m
        else7 f& g3 W6 `% [
        {
. U! S0 i' |, ^. {  i- H                printf("No effective message!");
7 E: j4 k% f1 Y1 \        }' y% O1 P. k/ K. x& A* D* T% K
}
( {5 u# {0 b, z( }% c
0 L* ]; _+ t/ L- \2 z4 z% D5 h7 c, G9 Y9 T' G8 V3 ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% t; d1 H) @& t0 s7 z; Q( }使用下面代码,对内存使用了mmap函数后:+ J1 G% _- S7 l# ?
#include <stdio.h>
& ^3 \  C: N. a" D8 n- N#include <unistd.h>0 a  Y4 X( k# }
#include <sys/mman.h>
* ?- q" r7 G7 _+ V#include <sys/types.h>7 E5 @# V% q2 m2 @+ k! o  L9 l& Q
#include <fcntl.h>
( |( q- w- a/ Z5 B( d, A1 p
4 |- a: Q( m4 O1 x  O#define SHAER_RAM_BASE_ADDR    (0x80000000); o5 t+ d1 H1 J$ {! [# M" ^* F
#define SHAER_RAM_SIZE         (0x20000)   ! Z0 P4 E' r4 e* h7 `" L* I

( {2 b/ @2 s9 x- htypedef struct
  C8 B1 M- d1 R/ L; l{
6 }0 N6 G; u) r9 [6 C$ y        unsigned int a;. k" h% W- J$ o' c8 D
        unsigned int b;" P. {; z) s! _6 j' S8 G9 ~
        unsigned int packet_cout;
' n% }1 |/ p, A9 d5 w% ^+ N2 A7 @- b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 _8 Q. J& {( ^3 ~9 C5 h$ q: U$ F0 x
void read_MSG_buffer(int *baseaddr);, V' A4 [7 t8 F
unsigned int count_copy = 0;/ P$ [( G# T! \2 A/ p* Z) Q

! ]& u% k6 U, j! L, t+ `* g/ Kint main()
4 g( i  s8 A9 G; U$ i9 h{0 X* n: E8 k6 g* X$ l6 [1 v% a
        int fd;
5 I2 _, h$ o( T$ D        int *mem = NULL;4 m1 P+ U5 q' J; c$ Z9 H

$ O5 s! d+ ^2 f6 x# C        if((fd = open("/dev/mem", O_RDWR)) <0)/ E: T" v5 M8 F' p/ i% Z0 x
        {
2 n/ ?) o* i; H% C  i- E                perror("open error");) ~1 l6 u2 n+ m4 v9 z; c3 E% u4 E
                return -1;
5 G: N5 e9 x2 b7 M1 H        }% t7 j! W8 E( B+ Q* j
        
9 W. o0 A' N6 k& ]4 _- u# h        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( i+ m9 u' \- ^+ S) C5 z
4 C; g: ], [" J3 V6 T
        while(1). A8 D! j7 q1 M8 G
        {
" x! L+ [" `0 u, t. _# P                read_MSG_buffer(mem);
* T! N& z& c) ?/ T7 I9 ?  z        }                + C  b' T) v$ r
}
/ @! Q# \, b: U# b. o3 i5 q# Q
9 X$ d6 p4 l* f0 ^. c7 }void read_MSG_buffer(int *baseaddr)' l$ k: g9 l3 a7 ?
{' U9 j# j8 a& C( M1 E4 g$ Y% |
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. p' _  l  P9 F" R% H2 t, z% W5 Q" `/ z2 L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ @0 L2 T4 I$ e" I) d+ y7 K5 j# W2 t0 g
        if(pshreRAM->packet_cout != count_copy)  y5 ?  h  ^% O2 O! W' n
        {1 H/ R, ]3 i# _" G; P
                printf("a is %d\n", pshreRAM->a);
& i. c# U6 f0 V                printf("b is %d\n", pshreRAM->b);
: Q" ~9 ~( o4 _# V9 q1 x                printf("count is %d\n", pshreRAM->packet_cout);+ C7 M/ q# ]- K( p7 j  m6 T; W
                count_copy = pshreRAM->packet_cout;, {  k) B+ L: a: h3 L2 ^+ y* _; l
        }, G- B  ~8 g- {# _4 P; w
        else
- _. M9 Y5 ]. F& O4 Z7 E" q6 Z) ]        {
0 l+ @' n3 |4 P( E8 Q" m0 X0 Y                printf("No effective message!\n");
5 |) R- Q0 z  _9 {! B6 B        }: B) C- s; J2 E6 \' m& Q! N6 P
}
4 Z$ n# w, C% g0 a) G+ F9 L, y" b& Y) W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 ]$ b! n8 H* {2 H, r
2 ]! V" K7 `2 F% O8 N$ T% l) K% E1 F
* W/ j4 K7 s9 f0 j! s" {6 L! _' n0 R& x8 |- e

8 u1 p3 e. t. g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 07:16 , Processed in 0.039013 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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