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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ ?; P% E4 V* J4 N8 E3 r
4 g9 l- E& I8 FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) X' ^" b1 V" l% n! x* _% \" b#include <unistd.h>
7 c6 I3 e) Y3 }#include <sys/mman.h>
4 a! _9 s( M# l+ u9 _" `, V, N#include <sys/types.h>
0 c1 ~$ f4 T' i, F) r, C+ q#include <fcntl.h>
3 [7 w8 x! Z( ^8 x; a9 B0 D: L+ F9 k, r+ G- O  }0 R7 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
! h, K7 U" U: G7 S+ V# I& i
/ L5 @- G( V. R& h8 Ltypedef struct( c# t8 L6 C" s7 c4 k/ i
{
6 W; ]0 D/ M+ ^& y2 i% m/ D        unsigned int a;
; Q* N! v* x& R' y) a. a        unsigned int b;6 a  i/ Y( o% H
        unsigned int packet_cout;; t6 w/ q& ~5 {& \! R. X! t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* Z3 l7 Q5 k! \0 }8 H5 [2 V% {* @, k. I( G/ R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( G/ h! t3 x& v/ H  g! L7 }7 @- \
unsigned int count_copy = 0;1 U: F; M  Y& Z

' ^! |5 M6 j3 y! K8 Y) y
, I) G* o! D( R8 U( ]& uint main()
! V% t) w5 c: B+ q2 I{
0 G+ E8 o, \: m, R  e. D, M: n' S        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 w8 M- [" H  @" R0 ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' r0 a% R. L4 Z  Y4 n
8 ^' E, I- F, N' i1 U5 _) B3 M
        while(1)
/ r. r9 \  y6 k2 v. E$ I        {) e# R4 P' I5 X+ w+ L( E5 Y0 Y
                read_MSG_buffer(pshreRAM);$ o- Q6 I2 s  D1 A1 o
        }                " t; r9 F4 B8 d/ V& k1 W( y
}
6 m+ |5 I( ~7 W: a1 `, M
1 Y- `# |9 @7 D# G; pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  q$ C/ N  Y7 a% l% f/ a
{! L4 J4 [. A# Q& y
        RX_MSG_PROTOCOL buf;
9 ?) E/ j5 p1 b/ G        & _7 Z+ n# I& j$ r0 T7 H* Q/ ]# T# ?
        buf.a = pshreRAM->a;
8 h) ?4 E3 T9 f) i  G6 G        buf.b = pshreRAM->b;
2 z$ z3 H/ }; l, `, d        buf.packet_cout = pshreRAM->packet_cout;7 l  R0 b7 B1 R8 j  n# B
        
# U" C! a( B- c! z/ o        if(buf.packet_cout != count_copy)
9 N* J( l* W( z1 |( _        {9 g9 b3 w' W$ N0 o; Q" O. R: S, M  }7 J' L
                printf("a is %d\n", buf.a);
4 e7 b" R% y0 k6 N+ d                printf("b is %d\n", buf.b);' C/ i: ^! P) }; _# r
                printf("count is %d\n", buf.packet_cout);  |" I8 u7 S8 Z1 s$ U
                count_copy = buf.packet_cout;! r, B# B5 V7 W/ V& I
        }
7 O% q3 }. d0 O# S        else5 ^1 L( Z. t/ G2 E# l# f
        {+ m9 Z& E9 \1 r% W9 S
                printf("No effective message!");
4 Q# `& g( i$ j8 Q# v& \        }
" V1 N) J% g3 e$ S" Y}' }$ D6 l. f5 x/ K
8 ^/ T% U+ @1 g2 A

/ R! ]3 G* J  q2 f" N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 G+ V# |; u% l
使用下面代码,对内存使用了mmap函数后:
, z6 @' k! K* Y2 A#include <stdio.h>
5 v2 c4 m, s8 A! k; ^) T#include <unistd.h># |  Z4 q9 a. a8 X% l6 {/ A& s, i
#include <sys/mman.h># i/ _% s0 w3 q. _3 w/ J, C
#include <sys/types.h>
( J- F9 t( S* u( b#include <fcntl.h>
! Z; p0 k  K! A5 Y5 v( k% \; A% E; g' U
#define SHAER_RAM_BASE_ADDR    (0x80000000)) @6 f% v5 H/ o
#define SHAER_RAM_SIZE         (0x20000)   0 ]8 n: n+ E/ K$ f6 j7 C

& k/ S% R2 e$ y. @typedef struct
5 T1 X% s1 y! f+ W{/ A2 P. w( D' V. E9 s/ [
        unsigned int a;, l, X$ Q$ c. G
        unsigned int b;
) }7 k8 X+ |2 M, E9 k" |+ G        unsigned int packet_cout;
, Z! b9 [6 I! h/ X. a% `. Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; U  X6 m  ^( f, [9 p

4 {) P. P9 Y+ _, gvoid read_MSG_buffer(int *baseaddr);
% e- n5 f: L. S2 c: \unsigned int count_copy = 0;
& t  P. D* H4 I: F4 h6 ^" d# F# b; _; B$ L+ @
int main()
3 Z: u& Y5 w! r" u# i% F{
) |2 h# q3 W% Q5 ~! a% M' s- K1 J        int fd;: b, p8 t  J6 S+ L% B: o
        int *mem = NULL;4 m2 m# A4 E! q% s: i% f3 Q8 z

( B% V  {* E  e+ U2 L: @8 T; l        if((fd = open("/dev/mem", O_RDWR)) <0), M: X: r/ ?( m3 a9 s
        {
9 ]% A. |( c+ B$ |                perror("open error");! U1 Z3 x8 }4 |4 p
                return -1;
+ I+ _$ B* K% _# U1 C' O' O" A7 w        }
' W- |0 c' e6 G        ( ^  ]" [, U& b( |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 P5 s2 U9 L; O; J7 A' P1 [9 X1 v2 b; h6 h; e, a" u# l
        while(1)" `) v) A" i/ I/ [0 _' `  q, h
        {
; f: X$ v; S7 S; ^$ Q) D$ o# [                read_MSG_buffer(mem);
+ n4 X2 F) f' L- u8 r% p        }               
( L' Q/ M+ |) i5 T' b5 q/ O}: ], R4 }# a' R. u

7 W# \* i/ Y  t) F% q$ Nvoid read_MSG_buffer(int *baseaddr)+ `, i6 @) r" l% x& y8 m
{
9 ~9 z1 }# x$ V/ y  K: r: f        pRX_MSG_PROTOCOL pshreRAM = NULL;
- b/ |/ z7 F) J" ?2 q( Q, ?# h, T4 I3 i1 p9 b4 o: ?6 N
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 M: [0 V* t9 h" ]1 H1 W+ T

/ V* I# o; e/ K, F) h0 r5 x        if(pshreRAM->packet_cout != count_copy)
' p4 y" @: f0 [) w! U        {6 H3 F2 e! s: a7 q1 w8 h
                printf("a is %d\n", pshreRAM->a);1 U0 U: Q0 L+ i
                printf("b is %d\n", pshreRAM->b);
" m" C8 n: f( e& f  J) s% I                printf("count is %d\n", pshreRAM->packet_cout);
9 l- R0 o/ _" D$ ?# L6 a* |                count_copy = pshreRAM->packet_cout;
' `$ e$ t0 B4 Z. p' f4 h% }/ ~        }6 S% w8 v2 j3 r' a, I: v' o
        else( E9 j: |- ~8 m2 V2 }2 b2 F6 F; u' M$ J
        {
$ v& ~6 h3 G' ]                printf("No effective message!\n");+ n$ [8 T" u: Z$ n. b/ k
        }3 B3 H2 k4 F7 ]( q
}
! _2 T3 s1 X) o$ ~" e2 }, t- u* o. K) {/ g: ~6 Z! K" Q3 J3 ?0 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& J; F# F, k# a7 i$ z/ I- F% ]. N: u2 o0 p

7 E+ e( t3 D% ]
8 V% t9 v, I0 |3 F* l3 m* V/ s8 `  D: t- ?; p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-9 03:59 , Processed in 0.038867 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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