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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( w! J4 S: j: _. ~- U8 |* ^
) i( R2 ^  @5 R* k. K& _( I; P3 r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ `/ t+ t2 x5 l6 N/ C2 Y1 h6 K
#include <unistd.h>* a; u+ H0 Z" }7 Z: d- {- c) |
#include <sys/mman.h>* G4 `% R/ g! G/ K7 O+ R- [
#include <sys/types.h>! H2 C9 w4 D0 c% v8 w+ X+ A
#include <fcntl.h>0 u" s! ~  s6 H# S" @/ w2 w

8 Y3 j( n3 o1 F, M7 X& X, ?#define SHAER_RAM_BASE_ADDR    (0x80000000)   # ?9 I5 K# _" U- o. J

( O% T6 V; y- S. C, Ttypedef struct2 G% P+ d5 n: m8 L3 Y. L
{
, j4 M2 v+ q1 n4 R# i        unsigned int a;
7 @1 P4 G( ~# ^' y! Q3 `. H        unsigned int b;: c4 A/ F7 D4 ]- o7 u! g
        unsigned int packet_cout;, n; P) k  p2 F1 H9 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 R0 k; T( b5 Z- ~1 @1 w
# i* r# i" @3 S" O; O. r) n' s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! M+ V% g! o* p* Eunsigned int count_copy = 0;) l2 D6 f: A; n; A: A
/ F" _. E% g: y2 g! D+ q
7 [0 ]+ o! [6 S6 J2 o- f* X
int main()
8 \  {/ B' _) n{
* J' I" L( z4 M8 P8 N8 Z        pRX_MSG_PROTOCOL pshreRAM = NULL;
; Z% ?& z" C1 [        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: \( g! {: }5 R0 t

4 z  h; E3 K" W3 n; Q0 f! w/ G        while(1). Z6 b# E5 l. W8 x% w$ f; u! I
        {
/ d( a' X# Q9 X  A  \                read_MSG_buffer(pshreRAM);
  M3 S- ]6 ]0 x& X5 }3 ~        }                8 h0 N- @2 p+ o) G6 ^
}, w+ a8 n/ W  }8 s

- K" h, Q/ j. ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ D2 l3 G: Y# X/ w, N
{
6 i7 @0 \$ d: O7 H        RX_MSG_PROTOCOL buf;2 O1 |" y8 u' C. m: x& v, C
        
$ Z3 S# s+ Y0 G        buf.a = pshreRAM->a;: J2 @4 _0 {) g$ z
        buf.b = pshreRAM->b;, j2 o5 m3 M+ R1 D$ E' y. @* F
        buf.packet_cout = pshreRAM->packet_cout;, s$ M, z$ `, N- l8 `8 c* O
        / l' G; c) s' ^( V
        if(buf.packet_cout != count_copy)
' u! [5 l4 c! F4 s        {' t  ]& r- ~6 j- H3 [4 Z, c; {
                printf("a is %d\n", buf.a);
, N/ E; g& u2 Q) k$ z                printf("b is %d\n", buf.b);  }8 A, [' a- f4 ^* A0 z
                printf("count is %d\n", buf.packet_cout);8 F, b! d/ ^8 s; d: C7 e
                count_copy = buf.packet_cout;7 X: I2 Z% ?6 ]7 I
        }% @' ^4 E* y! @0 T" h3 w7 k6 h
        else3 a  l  \. P% o5 b6 f
        {
. T& L* U- ~9 G" x+ x' ]" o                printf("No effective message!");+ q  Q/ ?) X! x) m4 H5 r
        }  Y5 U/ R. @( B+ n2 _/ E
}
3 y9 ~# S9 q' C3 p) y+ g; j  b$ P, g" `& A. a% j
. ]9 j( {. f6 H7 ~  `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: u3 A7 d/ t8 X6 X  u7 X* ?* Z
使用下面代码,对内存使用了mmap函数后:% ~2 m+ ?/ O4 _& F7 [
#include <stdio.h>
  t: u+ V2 l8 ?/ P' o% a" n#include <unistd.h>
$ v- n6 A, ]; I. n& ?4 D1 V#include <sys/mman.h>8 S8 Y6 [! _7 Z. F- x, Z$ g+ }
#include <sys/types.h>
2 U/ \& X7 N8 U3 t- r#include <fcntl.h>* H* e' B$ _' b  O: u6 S2 X

) K1 Z3 K& G5 M/ J% @) R#define SHAER_RAM_BASE_ADDR    (0x80000000)* Q$ \+ ]1 S9 U' a8 g
#define SHAER_RAM_SIZE         (0x20000)   
* H# \$ Y2 @' Z+ d0 N. [2 T
, c6 w/ ?0 [3 ^' S7 Z; B! s+ `typedef struct
7 f* L$ {7 b( E9 {+ J" m{+ G0 j1 a. y4 i& k3 C& k4 y5 }
        unsigned int a;9 z4 t# @( \+ ~# N  b2 x
        unsigned int b;
( @" r2 f; w$ z3 H8 d: |2 u        unsigned int packet_cout;8 ?2 w) |# U3 a0 `: E( e# R! e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. _% N* H2 r/ p+ a& e0 }8 Q
. l# o- T. n6 L4 S& S3 cvoid read_MSG_buffer(int *baseaddr);; |4 Y( z& L- m3 E4 `# O
unsigned int count_copy = 0;
3 W. X1 E1 l. ^+ j& K1 P' w; M+ {) i6 y5 P' x0 v
int main()
) a$ P. I% o+ t8 `1 a  {8 L{, K+ k+ M  z) w* w' ^
        int fd;1 @8 F" [6 N  Y' v  U
        int *mem = NULL;- x% p8 \/ L* E4 U3 R

% f" E3 l' p4 R2 d* g  G        if((fd = open("/dev/mem", O_RDWR)) <0), Y( \6 G# v1 ]1 x4 J
        {
3 z" t# M$ N9 s- x+ q                perror("open error");' _) L9 ]6 z/ }3 a1 M. p( A+ ~
                return -1;
# g* O3 y) W! O6 {0 c, B7 Q7 G+ {" Q5 t6 k        }$ J4 [; @  j( w
        # f  x. ?+ @4 _4 y( N9 n6 e- X8 a
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& a: S/ X+ T  I5 k0 o
$ O2 u. O6 A7 Z9 r/ L  Z5 c        while(1)
1 ?" Q4 A7 ]6 E* {: P        {+ b. V  n5 ?$ Z& U5 O5 B7 C- |
                read_MSG_buffer(mem);
2 l7 e$ b5 K* V        }                9 f( M# F- B3 T4 ^  a0 T
}
+ ~$ b' L6 W1 g/ q# t% j
6 G; P1 C1 s# g% ]5 f" p" avoid read_MSG_buffer(int *baseaddr)
' u3 T2 C3 M& u# Q& b{
9 }; ]" G8 U# Y        pRX_MSG_PROTOCOL pshreRAM = NULL;6 o1 G' Q& Y5 `' n& _/ K# U, A
) n. P; U2 N) P4 w: j  L
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ G% M: i% g1 v3 h! V( E+ e
8 D9 D# Z; x8 W0 K4 R
        if(pshreRAM->packet_cout != count_copy)9 e, [/ P8 J$ S/ ^3 _! ^
        {8 p, N/ Z. K- b5 n5 k5 u4 [
                printf("a is %d\n", pshreRAM->a);( W- b0 h( a& K1 Q; z
                printf("b is %d\n", pshreRAM->b);
3 Z: {8 Q; V/ L1 \                printf("count is %d\n", pshreRAM->packet_cout);0 w1 f- i3 F/ {# B; {: v
                count_copy = pshreRAM->packet_cout;& x* D! ?) T7 u  E' W
        }( W# B9 }: R5 Z/ P4 l7 C6 y% ~* k$ U" |
        else
& {' R9 A: R' Q2 i5 x/ m) _        {/ {! j1 u# S8 T% p: y9 _
                printf("No effective message!\n");
! ?; t1 @0 Y0 ^( v) M        }
  D% t1 \2 Q0 ^! Q. \9 {}
% K# W* g3 d5 C1 @; F9 l  a
- i4 Y8 I" R: D" u- G. i1 P+ z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 f' ^* O' S; W( K3 j: |6 r; s

; B: y+ D1 L- P# X. V6 b3 c4 Z  f' p9 C

4 F* r5 {8 v8 A9 {' Q* l
$ h: m) a' v4 A& u& V3 \$ p" d% o1 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 02:54 , Processed in 0.038699 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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