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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! |2 V) n2 C8 K, C! d# F
& ~. n7 H9 s; E' ^; c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- Q3 v; S& f" x! J#include <unistd.h>" t& ^7 N1 Z7 C3 Q
#include <sys/mman.h>6 }% g% K/ d  ^
#include <sys/types.h>
4 P" U) f- Z, O& S0 K6 @9 }5 L+ N#include <fcntl.h>
9 S4 Y1 v4 e; h  j& Y
& r1 N: _1 E" c) p4 K#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* j4 N2 j) Z% ^1 \
/ D6 [$ b8 B: I. ?5 ltypedef struct
$ J& H" P2 k; h" I; q$ y- L{
( m: K6 P2 q: {/ f+ b6 C+ S        unsigned int a;
5 y7 i) K/ B  S        unsigned int b;
" ]8 v0 G7 i1 \6 j4 B! S        unsigned int packet_cout;
% t- B. {! t# Z! l0 m  r3 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. v2 T' J- K) D9 J1 K: |1 `
+ A2 ?  h6 A. y9 @% F, m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) y7 A/ }. B  N2 p' q$ r% T$ S+ O, Sunsigned int count_copy = 0;# S9 w& R% C! i9 F8 E, j
8 J0 I4 Q9 }  g/ n- n
; {/ x# J  }% }  V" c) ~
int main()
2 H. q/ _1 y6 _5 J* G' q& P3 D{8 s- X* [7 Q; l- i6 D1 Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 H( Z" e: B' y2 V# N2 Y; V  n
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( K* `8 W# t1 _5 C- T! Q' v# Y

/ @1 y1 Z5 y. N! G        while(1)
' k6 i0 T& ~) b8 e  Y        {
9 f+ j3 B$ {: W                read_MSG_buffer(pshreRAM);
( ^% a; N" v; B" A        }               
+ e( C; _! ?1 Z& }6 [- {}$ Y* e& q6 M( O

* \% _4 c' a& r. Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& ^' o& b4 c  o+ c/ @6 `7 K{5 u6 ^4 @: o8 e! j
        RX_MSG_PROTOCOL buf;- b4 F' n0 r. {9 ?) ^3 g$ `2 ?+ u' s
        0 _; {+ o/ q, T" [( T
        buf.a = pshreRAM->a;
% d3 G0 S8 ~( D        buf.b = pshreRAM->b;
# p/ [) K6 K  T        buf.packet_cout = pshreRAM->packet_cout;  D# k/ x1 F/ F  W
        
: R6 S: c3 X/ u( R" H( J        if(buf.packet_cout != count_copy)
4 G( u7 `) V! u5 d7 O+ b6 ~9 W        {
$ i9 e2 a8 f) s) |2 e6 T: L( C6 g                printf("a is %d\n", buf.a);
) u" V' i" W" ~% t0 h3 G) w                printf("b is %d\n", buf.b);
% V# m: g4 A+ _8 \7 Q                printf("count is %d\n", buf.packet_cout);
' i5 t( g. c' n; Z. m# T                count_copy = buf.packet_cout;) a$ Y% t: I  g* S3 D6 I! F4 O
        }
. h5 j# t, L8 L6 c- M- M        else0 x8 \2 v- T/ Z$ X  \& S& [5 G* R* Z
        {
1 a# T5 ?$ c* Z# y' X! N( R                printf("No effective message!");
- Z, u) b" G, |: ^$ m6 j        }5 o4 q2 l) j( ~$ n" J/ X( C' T( ^
}6 d( T" U0 _/ u, |- C+ [! @! t

" g( B1 t" y- [/ {: ?% R0 u5 z' V) S  Z0 A+ w6 N8 ]- t7 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: M) o- X3 B/ b+ f! }1 a$ L# }
使用下面代码,对内存使用了mmap函数后:
6 o  b( l" t4 R$ k. [1 p& w9 y#include <stdio.h>
" M3 L: O; L/ Q7 m/ i9 q( M6 P#include <unistd.h>
  i4 H" t7 y& {8 h( V( o/ a#include <sys/mman.h>! @& L2 E4 p/ ]
#include <sys/types.h>/ C+ Q1 }4 M! }' P+ u8 b
#include <fcntl.h>0 V. Z5 |* b. J( u9 R2 p
6 Y, d. _+ w4 V/ S' k6 G, B
#define SHAER_RAM_BASE_ADDR    (0x80000000)
* L1 X- p$ l. F8 }2 t- `. |1 ?4 F#define SHAER_RAM_SIZE         (0x20000)   * \' P# v* R* i+ Z+ P4 ], O. y
; }6 ^9 E6 j3 o! L. B: V8 z
typedef struct
7 v; Q  ?4 V3 d$ P' P* O6 l/ v' W% G{. b2 B7 K5 k' @
        unsigned int a;% Y; G  A9 {9 f( t
        unsigned int b;
3 _! i* ?- A. m! ^- R* N        unsigned int packet_cout;
" U4 ?1 j2 m( {% ?. m/ I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  ~% `: R# |% g' V: D9 P5 s: h/ T) I- O6 P1 p( _' Z/ M& i
void read_MSG_buffer(int *baseaddr);: I) h& E9 E9 e0 [% K$ n' F
unsigned int count_copy = 0;: b0 f0 }6 A, P( U
2 s3 R/ J, X" v# r* b' J' x
int main()0 v7 a' L6 }' m
{
2 A  F5 i% v1 V1 l( N1 ]        int fd;; x% L4 o2 z' C6 i' [
        int *mem = NULL;
' B4 P. y; }- t. Y; g. u- j: Q+ w) _7 g/ m7 \
        if((fd = open("/dev/mem", O_RDWR)) <0)" Y1 S* K; n1 |8 q' @0 ~
        {
( O, E7 c' q7 |                perror("open error");
4 Y# a( ?1 ^  Q! k. s9 W                return -1;
0 F5 x) e: w: v' s        }. |2 {! s; M6 m% _
        6 S" J# B' R, P% ~
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. K% c2 A& ~- r$ N+ t5 `: I$ N0 ?9 H) m4 d) D3 @
        while(1)& l$ [+ {/ R1 |7 n0 ?7 F# e
        {9 B/ x( e& B/ y3 F1 h& U
                read_MSG_buffer(mem);7 H( w) {( ]  E3 a$ T: v
        }               
" q) x) y8 o9 d' g/ j}- ]9 ?, \( w* M6 M

. e: C! Y: B% b+ D6 q; I1 cvoid read_MSG_buffer(int *baseaddr)
) N4 I, N& H; Q& T# R, F& [{/ H3 b% S7 Q9 A1 y( M6 B
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 x/ e- k7 O* }& j( S

7 i0 p, @7 n# o4 W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 w( X  Q/ F" h" X6 E3 s' s

" s1 V0 U; \$ P! s; y. z        if(pshreRAM->packet_cout != count_copy)3 k0 j* M$ s9 W. c2 ~9 v
        {
' |# P# N/ ~# V7 }                printf("a is %d\n", pshreRAM->a);
# ^" a, k( e7 q. `                printf("b is %d\n", pshreRAM->b);# @  [- ?, t% w
                printf("count is %d\n", pshreRAM->packet_cout);
5 b/ b. Z/ H" _) j# P8 u8 d  |                count_copy = pshreRAM->packet_cout;7 {: ~# j9 Z6 W$ D: \* y  O
        }
. i1 Y! M( Q5 P) c        else  e2 Y+ r  }# _) k! L( l
        {# {, P' E; Y+ ^) N0 k
                printf("No effective message!\n");* h! E; p5 `- {; |
        }" L6 @9 |, t9 |( L# d/ G- S3 J
}
  F% J$ j8 Y: m5 n4 j
: _8 t3 O2 y1 D/ e  D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; D+ h# x& r6 c( T' ?6 }7 k/ N
' d  @0 @/ A8 g2 |# e. j8 t( h
/ e8 P, h* e6 P: C
2 Y- _* O) M! Q8 A; o/ M8 L

% M6 U% O  m9 {* J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-10 03:44 , Processed in 0.040888 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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