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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 o8 f! z( a, {+ z. \% @0 H4 g/ k7 v1 K7 D: |7 O' k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! G& x( H" Y; u: q
#include <unistd.h>* I4 N& l6 |! X" U1 ?
#include <sys/mman.h>+ g+ f2 Z* y# E
#include <sys/types.h>- B; F% \- J) z& e7 n/ a+ K
#include <fcntl.h>$ M7 |4 F5 x7 @$ i. y2 c* V
& l+ B% J1 E: K  e8 e# }/ [" G4 S
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
! n% d. b, `" W7 H/ U# I* O: i* m; l+ F: \3 s
typedef struct/ @3 [+ A0 c3 i5 Q, e, }
{# @. i( U) X( ]) t; d: h  g
        unsigned int a;
! q, b3 {0 D# Y% \: u( l        unsigned int b;
4 z7 P2 U4 g; m# V6 O3 E# Q6 T1 O        unsigned int packet_cout;% N9 F, ~3 [' r% L9 D6 E9 |4 @& l+ }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# I( l% ~* Q$ B) b8 y  @7 f) }2 S3 C) [0 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 F6 W8 B: O$ `) b8 C2 d2 cunsigned int count_copy = 0;
6 O" R- ^+ g. g1 g7 r
* W# }# A2 B  `. L* o* z0 o9 @" c7 g3 _9 d; H) T1 y* G
int main()
: I5 ~/ ]" f% Q: N/ K! e' i{
: w6 g  u6 I6 \$ u5 B$ D/ r4 F, D" a        pRX_MSG_PROTOCOL pshreRAM = NULL;
& Y. @' g2 c' ^8 d. h2 `) Z; c        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  i  y: f* k9 M' d6 M3 m$ q, ]3 {/ y6 J
        while(1)
5 y0 p( O7 N! N8 P% K        {
$ o6 W( l. u9 p2 E# L( {                read_MSG_buffer(pshreRAM);7 z+ d  O! J- A' H1 i
        }               
6 R6 S4 ?& L# o* ^}5 Z  K, C0 q0 E
( v& g, R" N% a, [9 f; v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 c7 X0 F  H' D{
# W3 g/ \& j2 {6 y        RX_MSG_PROTOCOL buf;
0 ?2 L# K) |! p+ ^        
( g( R: C' {: ?+ T. |5 H; m        buf.a = pshreRAM->a;
: o+ G) ?3 b+ o        buf.b = pshreRAM->b;
$ A/ D0 [7 `' E" H        buf.packet_cout = pshreRAM->packet_cout;$ _# d( d: k0 b# I; c" L! z
        / w" b# v; V3 @" O" i
        if(buf.packet_cout != count_copy), z0 r0 }! @; l% q% t/ b
        {
' i" h: h- R8 f+ t9 e  Y5 o- y# [- i                printf("a is %d\n", buf.a);4 T* @, {. N# R, J
                printf("b is %d\n", buf.b);
/ e' A: t- L, A                printf("count is %d\n", buf.packet_cout);
& E3 L/ R6 I! e4 U, G                count_copy = buf.packet_cout;
" x3 ]. l( t. ^8 h, f        }; B6 C7 b2 q" @
        else7 F! T. k: u, A  |6 G# J& \
        {
1 L/ O( P+ s, f4 `$ s* E* U9 {                printf("No effective message!");: n' t+ C. z/ c0 O
        }
/ K5 @4 ]/ ~6 q9 E}; D, ~" w( M. r& A6 v) y( y! q) S
% {. p* ]2 L1 Y5 ]  A

7 [5 ^. {- |0 [. ^# y' t* s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 C; K9 T2 u! w5 E% c+ ^- S
使用下面代码,对内存使用了mmap函数后:$ f8 U$ k/ E, h5 U6 G6 d- x( u
#include <stdio.h>
' e7 ~' w& _' Y. c6 r5 }4 B6 r#include <unistd.h>$ g6 t8 C% @7 u3 D' v% g2 `
#include <sys/mman.h>( N, G& n) l' `  M$ O, a$ S5 R
#include <sys/types.h>) E- ~% D! I& m% T; `
#include <fcntl.h>
5 _7 R  _7 v+ i0 g  Z5 P# @! U- s$ m5 h1 q# U( e
#define SHAER_RAM_BASE_ADDR    (0x80000000)1 r0 E7 ^! C1 f! V
#define SHAER_RAM_SIZE         (0x20000)   ; q+ d" X9 q+ _9 S3 x) N
$ [3 l' G9 G/ A
typedef struct
+ D6 z+ @, r- x8 r+ D1 n& d* }{
$ s0 ?" R, F7 S* \  l0 ]        unsigned int a;7 R9 x8 |3 y4 s  u; @
        unsigned int b;0 G. M; Y6 O( ^
        unsigned int packet_cout;
, l% A) }% q% S, B9 |$ o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* [1 T9 I% o2 S2 F4 K  i+ [# ]0 `
9 Z4 f% K+ [' V) [  a% s5 s0 evoid read_MSG_buffer(int *baseaddr);; D3 S8 x6 J$ s, q0 F
unsigned int count_copy = 0;4 T2 |4 C; K! W3 k( Y

2 o- J! g  ?1 ^7 a% A3 I* |( hint main()1 l" W8 M) P) f+ v2 F0 T5 e: V) x& v
{
) u3 b: [9 r$ `2 [- Z+ o        int fd;
# f7 {) j$ a9 E; P3 H        int *mem = NULL;. z8 X1 I1 c# ?& C7 [6 N
" D4 U' P# a) s3 s
        if((fd = open("/dev/mem", O_RDWR)) <0)
8 P: c3 F5 b9 P5 O: c0 R- l7 y        {& l5 D5 s* w+ p( _
                perror("open error");
  {5 j5 _5 w, O                return -1;
+ @" j9 O8 Y3 a9 A3 b; f        }) `) G4 G/ t/ N& G1 O' a" x
        2 E5 O/ H+ }" a- Q! L
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ I; Z! o3 I0 p  H8 j9 @& f
7 W1 a- q' i2 K- _; x7 L
        while(1)
' o% f) f! l; g( z* q( j9 N' m        {
* S  x: c  |+ \6 C, K4 y% w+ I0 o                read_MSG_buffer(mem);, P8 g+ Z) K' [" d: D9 {' ^
        }               
" D( a1 A% y/ b/ o+ _) ]}
' u1 u! [! S- K
' C( Q# r' w7 _/ O$ m! Dvoid read_MSG_buffer(int *baseaddr)  b( F- x! F# v+ I
{2 |8 \- L' R7 L* b) f* y& ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) Q$ d0 c/ {+ u/ W4 C9 B# a9 O4 r. H' \( s
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 [! d1 C2 R/ d2 @( |! R& n) A1 Y$ V0 {- X1 o9 D
        if(pshreRAM->packet_cout != count_copy)2 A2 L9 x/ Y" \! u! E1 d: l+ J
        {
  Y, h5 z; a$ ?3 N. l: V/ W3 }; r                printf("a is %d\n", pshreRAM->a);
* E+ x6 n" E3 `" d( X" W                printf("b is %d\n", pshreRAM->b);
: U9 o$ |% _- |' @' x                printf("count is %d\n", pshreRAM->packet_cout);
; G" G5 v0 o2 ]4 K: X' d  ]                count_copy = pshreRAM->packet_cout;
1 s) \9 `7 v, O( d        }
0 @. I' t1 v. i7 J" g        else  I$ p* V. j% I2 H  b# f: P2 l! \' E7 z
        {0 }2 B4 B! t, l1 Z( s
                printf("No effective message!\n");, ~5 w) `" o1 ?# r6 I  S
        }" e2 ^  k" a' y# {9 i5 g) b
}
- Z0 c5 i, }2 Z/ e9 q8 G* F1 D! N1 }2 K# v8 G3 ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' w9 u$ C1 t3 |* I4 X/ [& |

# f0 R* s7 V* ~- S! {3 K$ j9 c0 A
4 E. p1 m2 e- c  ~

6 N$ ~" _! F' h1 d' C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 18:05 , Processed in 0.042077 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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