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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) T9 x4 G3 s. e" D4 H1 E% G7 m2 ]4 b4 v; R
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. ~' c; @$ H# c" p9 _0 ^! ?#include <unistd.h>
3 A6 ~6 m- F6 v, d0 I9 p# b- O#include <sys/mman.h>
6 q; Y, C$ i- S7 ]" @# O1 s" n#include <sys/types.h>8 o" \3 w% H! p5 \/ {: ~  R
#include <fcntl.h>5 J0 p- P: ?' i" H- X: Q, C

* V% O$ z4 N3 Y) k& m; y* [2 y#define SHAER_RAM_BASE_ADDR    (0x80000000)   / L+ x1 d+ K4 r, n

* d( `1 q# V8 [$ F" l9 g7 j, r0 Z9 _/ Dtypedef struct: b7 Z, Q# v, i! H  o: H
{0 H( S! N2 ]; \' z5 Z
        unsigned int a;
' N; s1 H# s6 j" R. x        unsigned int b;- I8 h1 I- c' h1 I( A+ {
        unsigned int packet_cout;; k+ l5 T9 V5 m; d0 A: \2 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  x3 m$ t6 m* R% u5 N3 i
' U, c) g0 b" J- F6 r* |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 U, G( D0 h8 D& a& O1 H- }unsigned int count_copy = 0;
# [9 D! G( l7 ?( M6 P& O
+ k2 r; }! g$ B: x( J  e% h/ C1 U! A( r: [* P9 G
int main(), U8 u+ z4 m* ?& [( t( z6 S5 J
{+ N/ B; L: f2 j
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 |' G3 n6 y6 m! m5 T* T
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* \: J. x& {8 A; L
2 a8 r# l3 `- O; W) B5 p+ b4 I        while(1)
) J( C% f" M" c4 a) C        {+ [- T- j, N% ?- C6 H7 U) f1 W! F6 h
                read_MSG_buffer(pshreRAM);
, V2 n* `* J1 Q' s& Q+ q        }               
' |) V7 f) q6 d& y, |9 b$ o}
* m6 K$ o' }* I! i! i/ s. ]) t2 S( i9 O2 R/ ^; O( T" m& h' m9 {) ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! c/ l. _7 f# b
{* A! {1 ]: J) W' A" k0 s% x
        RX_MSG_PROTOCOL buf;
/ A0 s  T5 i$ T" S+ O        3 W( c9 d+ ^3 b1 V( e' S
        buf.a = pshreRAM->a;- E: M8 [+ a1 F" C
        buf.b = pshreRAM->b;
# j3 {8 x" c7 o        buf.packet_cout = pshreRAM->packet_cout;
! q$ y$ s" u" t, r) l- X$ c        ( a7 \/ \' v  i9 o: D' u8 \1 M
        if(buf.packet_cout != count_copy)& i. E& L1 k% @2 J& f; _. C
        {
# F1 G3 ~" G! o" K; a                printf("a is %d\n", buf.a);& w4 l, i. _* ?( X& c6 r' g; p* a% n/ E
                printf("b is %d\n", buf.b);, P: K9 V- B9 M. e- [
                printf("count is %d\n", buf.packet_cout);
0 Z/ ^( [/ N7 K- E" D& t, O                count_copy = buf.packet_cout;: N( _* ~# O+ E# Z, u0 O
        }
3 o% ~/ m2 i2 F# t9 E9 g* B- d, \! Y        else: ]. G2 [" D8 x4 ~# |
        {
$ ~) c& [- R9 l3 g2 C1 H9 B5 _0 M                printf("No effective message!");
+ L& H* B: L& j        }; z) q! O4 X& A/ o6 i5 ?, J7 B
}
# r1 ^' z0 }, g2 Z3 Y5 P& K, l" T8 O" C. s: b7 ]
/ j1 h' G) W0 @6 O  }* O, [9 ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 d7 c& }* h/ Q* J7 }7 e: |7 W( D使用下面代码,对内存使用了mmap函数后:8 l) Y. x. q3 y- |
#include <stdio.h>
7 B% r5 W0 f+ D# [" j  t#include <unistd.h>
5 s  i% t) l! d3 ^* K#include <sys/mman.h>
) D' I- n% j9 @7 u0 p0 ~#include <sys/types.h>) \) `0 x$ a7 Z+ W- e. M
#include <fcntl.h>- p# R8 }3 ~* I+ J' B- r0 ^

3 ~+ R3 H' w$ b* t#define SHAER_RAM_BASE_ADDR    (0x80000000)3 [, e& N7 U: w6 j6 o
#define SHAER_RAM_SIZE         (0x20000)   
/ R, {0 M4 @7 p, H& G! d2 I) _1 S) I( _) d+ ~& |5 M. g
typedef struct
; L; Y: u& q4 T7 ]5 {* b! I0 n7 }2 H/ z0 f{
& ?% E  W3 |, z, c/ d        unsigned int a;
5 B, Z( `2 D7 l" }        unsigned int b;/ I9 \4 O3 p5 h3 Y5 `- R
        unsigned int packet_cout;! R' R! S* z3 ?% F4 \! ^8 s) T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 r- g3 B7 v& S0 M
7 J2 r3 C: c( v  |! }: |8 d9 Mvoid read_MSG_buffer(int *baseaddr);3 Y0 u' k& l: ?0 N3 _# @
unsigned int count_copy = 0;
( @6 E2 u  v8 B. K  I( E
" g& W8 t' S3 Q: T3 _6 U4 w" Pint main()
3 {- f) b& m0 Y. i3 L{- n& G- k+ c0 ^
        int fd;/ c* T' A0 Y6 f# _- r+ p
        int *mem = NULL;
9 u* D0 U2 O6 d" t. f0 d# r, C- |6 Y! G6 ?  B/ R
        if((fd = open("/dev/mem", O_RDWR)) <0)# S; C; i# O/ T
        {; u& p/ n: K5 g9 m# P
                perror("open error");8 w) l" r: c" V" L. K' t: O6 m
                return -1;+ \9 ]) e& F* a) F& y* A! K
        }% y  ^, l0 j; ?$ B0 V
        
. n4 |; Q# x- ?) V        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 J3 x$ D9 V$ @

  h: \# U( @$ B: ]        while(1)+ d  o' T4 R  ?1 _7 Y) s) \
        {6 v/ w4 D5 X! y+ a
                read_MSG_buffer(mem);9 H; A# p2 m" c. `6 E3 J0 @
        }               
, d* b& [& e3 G6 ~+ B  z}0 E! f" H) ]! r$ r0 ]" X& ?. o
+ s4 x& ^4 L" }+ }4 A9 w% P3 L$ Y- n0 M
void read_MSG_buffer(int *baseaddr)
( T+ v# @/ g$ Z5 x$ i( ]{1 X9 V  Q' _- O6 Y/ F5 |  g0 i
        pRX_MSG_PROTOCOL pshreRAM = NULL;& S9 @! |  d3 ~8 E3 `3 z7 Y
9 Q6 D* [8 N0 [
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" }9 k2 ^* d1 g4 `' f
3 g, J& y( X% h: M        if(pshreRAM->packet_cout != count_copy)
8 H9 s, C( Y: I; o        {4 Y4 ~/ {5 R! O9 ]
                printf("a is %d\n", pshreRAM->a);( Q" Z/ G: B2 Z3 b+ A6 w
                printf("b is %d\n", pshreRAM->b);6 m9 U1 t% J5 H7 t. `
                printf("count is %d\n", pshreRAM->packet_cout);- m% w1 B, P6 f5 G2 R/ A9 T
                count_copy = pshreRAM->packet_cout;. J) R  s1 i2 T+ {
        }
. ~: _" J4 W, {! d+ J. W        else; o& e7 R5 c; ^) B5 c5 v- Q0 u* B4 G
        {
% r! `! ]( _3 u6 m# |/ s$ T0 B                printf("No effective message!\n");
" S3 g* ]/ h7 q+ `& ~  S! q        }! F1 W0 J6 u" V, i! `/ ^, q+ s
}8 ]( u# v1 i$ X( ~0 G$ T1 E
; l7 u# U$ q: m% f$ K/ m8 O! e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: T  C  g* E4 e# d2 a
/ S. b# J8 t0 I. j: `
' U% ]+ [- o& @. e3 w) \9 G; R6 ~
5 r: j# z* i7 L5 x* M8 p* A
7 y2 g* Q, c3 s# U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-28 00:59 , Processed in 0.039987 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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