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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ b- w# S0 R2 x" ]7 K
* X& w3 J# D, v1 SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' M9 ]7 |) k" l' u
#include <unistd.h>! i- c( L  L+ ^3 U
#include <sys/mman.h>
, X2 l5 Z+ H4 w$ d5 A) j) r#include <sys/types.h>2 y$ {( b) k9 G9 @9 S' {6 @+ ?$ m
#include <fcntl.h>
* \$ G2 c" {% }+ H& {7 I6 H% d
: o* T. {6 o" l3 D/ u* E1 U#define SHAER_RAM_BASE_ADDR    (0x80000000)   * Y& o- ?( P1 g; e, n; _: P) ^

7 J8 ^; j$ D" x7 s2 i- D5 Ytypedef struct
2 A) F. v6 Q) h7 |8 p: }{
) ?6 B; Y3 f' d- s. _2 @" `, w2 h        unsigned int a;" _$ |8 [$ y( K3 B( D
        unsigned int b;
9 W7 b2 d! N; T7 E        unsigned int packet_cout;
+ j& }  y& \4 }1 M- P9 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ m: p6 d  h! T' A/ v0 x

6 K1 V! \; d9 `# J+ s7 m* W( ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 C, u5 ]# x1 W4 k  b: p& S: F4 t. t
unsigned int count_copy = 0;
5 B$ S. K/ O3 J$ D& `) g6 }! ~% {% f( Y- O3 p

4 Q" [  @  _  eint main()
! a( S; B2 H# {9 E{7 m' `8 T2 z- ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 \: \; v  B4 z# C" n$ U3 U        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; K  _  I1 p- b1 c9 s0 I

* _; T, L% i$ F* I        while(1)& S3 x0 [/ q  Q* O/ f
        {
! r$ U) b" V9 R. Q" i  L( s$ g                read_MSG_buffer(pshreRAM);
3 U6 R2 N) m' w8 g        }                & L* Z4 `0 C( ]0 u! j1 M4 ^0 J) X2 U# B
}5 q: L/ M. t2 S* Z! h  @
3 S* h* l1 B' e' O1 ^& {1 J( o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 n5 L  `- u4 ~. `) [6 k+ S- ]) L{+ a0 ?" Y! n+ Z  ^4 e. L3 \( V
        RX_MSG_PROTOCOL buf;! F! \( J! e# q# ^% t" V
        
! ^3 d5 y6 S1 p" F* g        buf.a = pshreRAM->a;& o- x6 J$ B6 M$ P) k
        buf.b = pshreRAM->b;
- N0 q( d3 M3 r: r- U& a        buf.packet_cout = pshreRAM->packet_cout;: O5 }4 w* r$ T' B
        8 t" O2 H1 p) W9 ^, l
        if(buf.packet_cout != count_copy); f! d) p6 W! ?$ j
        {
, C4 H3 I: S8 B. g$ H  t                printf("a is %d\n", buf.a);
+ U6 L; q$ n' G0 o) \$ h                printf("b is %d\n", buf.b);# y" {+ O& _; f
                printf("count is %d\n", buf.packet_cout);
) Z$ t# ~' k: H) P7 z% A3 m                count_copy = buf.packet_cout;
3 f% v  Y4 J8 h% e2 Q' c        }# E4 k6 v9 f( ~  J
        else+ p+ n) ~$ a! q4 H) T: [" I
        {
9 S5 B) i9 R% u0 d0 C. T; c                printf("No effective message!");
3 G# l4 L) a/ c9 \, W$ w$ K# w        }/ d( q9 z* p% I1 }' [6 S: h
}& |- i" d+ g: Q0 O0 F1 g
# u! N% O" F' t: F7 x+ J, X
) @% r2 u2 ~' v/ H: K; `. ?( a
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, V/ x3 ^' g3 a& `) k" j5 l使用下面代码,对内存使用了mmap函数后:
. @' D0 I) r& \6 Y. P- f3 [* \#include <stdio.h>
/ j, N  A6 Q% ?  p#include <unistd.h>4 \8 w, ^  Y7 }7 D* ~- O% ^) S4 \
#include <sys/mman.h>+ k1 v% V' }' d5 l& Z9 @
#include <sys/types.h>
$ Q$ e! E! Y9 f  m1 h3 ]" g+ u* O0 p#include <fcntl.h>! `1 D, C) @% Y" {) [5 S4 G# v; h( e' z

6 r/ U) a: H& j3 }#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ _7 f. M3 g# W# x+ G2 F' l# I#define SHAER_RAM_SIZE         (0x20000)   
7 W/ d7 ?5 w/ ~  Y) e5 i, Z. F4 J$ {' h$ Z- m( D
typedef struct5 J, q3 _0 x- a5 ?; ~
{
# @) ^9 z5 y) o( H5 u; P        unsigned int a;
" k& b7 S% h" U# k7 E$ x5 i0 O2 l2 V        unsigned int b;# {$ W1 F. y* `4 J
        unsigned int packet_cout;! e. w& d! x% R* d% ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 A, `- a( f4 {9 k0 l1 X7 |+ D

: ^) U4 X4 N( {+ S" d5 {9 T" \void read_MSG_buffer(int *baseaddr);
" |' Q: p. A! C* t1 W5 D5 {unsigned int count_copy = 0;/ m& A1 Z# x0 W  H% l

' c; \! s2 `* U9 a1 S* Bint main()
# F' F& G) Y3 k; ~3 F3 k{* O$ _3 }* @8 B
        int fd;
2 U7 m; ^7 R5 {$ ?' U' a6 O        int *mem = NULL;
7 {: a3 S8 w( K, n- ~
( M. s. h/ O3 U        if((fd = open("/dev/mem", O_RDWR)) <0)
2 o* l- G2 V! d" s: ~) C+ x        {
' U) V, L0 T2 s                perror("open error");( T" U2 ^6 i* x8 X$ d9 B
                return -1;0 H. {/ f3 s  l: a" [
        }/ \* }* ]. `5 D( y) y
        
' ^# ~. C7 y0 m5 m: d        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 ^4 X/ Q* W9 U( J

- d7 n+ r5 ?- _+ A        while(1)$ X9 Z1 @# B+ r# X, j% |" R# Q
        {7 p0 X" q1 _1 Q2 }) R! ]
                read_MSG_buffer(mem);
4 r9 T& f3 z4 C7 a3 D% B6 @        }               
  t( d5 G9 o  _, m3 p- X8 b  Y}
8 H, J3 {; ?+ ]6 k2 q" V! P; o2 L& o1 W8 X- @
void read_MSG_buffer(int *baseaddr)7 Y. m8 k8 E# M+ l
{
8 O7 |" f- N! }  T8 z4 p( a( M        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ E6 y/ b+ S6 u
- a1 o  ?; K2 i% q' P        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' p( O' Q6 Q  K( C( o
! L0 d. q" g3 I5 C. _) Z1 Y% @, W        if(pshreRAM->packet_cout != count_copy): l/ T* X' G8 `* @$ d- P& N
        {( c8 }1 H7 J1 ^  O2 z( [% p
                printf("a is %d\n", pshreRAM->a);2 O. X9 j  b  E/ k
                printf("b is %d\n", pshreRAM->b);
/ y' }: G* c. K  x9 c; U* D5 X                printf("count is %d\n", pshreRAM->packet_cout);+ A: p% k) B& W. I$ Q- J
                count_copy = pshreRAM->packet_cout;
# f( \% F( z( M  A( Q        }
8 ~( t, g1 H# s. F8 t; v        else
* x( `/ q- N0 m7 i: c( ^5 u/ T        {& D% S; I' k& K; ]8 d& P% R; t
                printf("No effective message!\n");
2 o$ H5 a. r0 n3 W        }) ~/ `+ ~& m1 F$ x# S: m2 {
}
. f" G" k# l6 [# k, t% \! o( q8 c9 T
- `4 ]0 e. r8 T. [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ U) U! q* N/ C, ^

" p' b2 V1 F2 [  y; j4 E
* `3 d) N, o& N+ @1 Z- h5 H; k' X7 W# x

' Q* b! t% b& j: \1 t( B3 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 05:02 , Processed in 0.040147 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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