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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& J$ g2 D8 M. O3 C" a  [2 ^8 q9 D3 t7 N- L3 B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 k, F1 X" e: u" T#include <unistd.h>5 L1 o& A/ b# r4 o
#include <sys/mman.h>' e. @5 ]/ b8 u$ y! r% }
#include <sys/types.h>
5 y5 M- W! W6 W: n* P#include <fcntl.h>
$ `. ~2 T& G* [7 l0 f% C1 K0 N5 q& d" v$ M) J. k  ?+ d, o
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # Q$ @( s3 ~( S8 S0 j8 O4 E& ~3 z

6 t- i1 d" U1 W/ V4 y+ |  |typedef struct
4 M/ {# N2 ~- p+ Y{
5 r* @) F. h% l! c/ W/ M        unsigned int a;/ H) ]; s  _) O5 `1 K
        unsigned int b;
+ X% n' _: ]( U        unsigned int packet_cout;7 Z3 X" P% E* J4 t8 Q6 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 k* f' @, y% i
" G8 J& I5 B- z2 ^+ `7 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 k$ T* t, ?3 G8 S' L/ y% Kunsigned int count_copy = 0;% y, r' K& A2 A& Z( p  A, H
- ]. |# }6 ?, F  E
8 I( B0 G7 i$ e
int main()0 x: E3 N9 l( }2 s5 E
{
6 P) H5 E0 n, M; z, p' w+ m- V2 T3 q+ F        pRX_MSG_PROTOCOL pshreRAM = NULL;4 F8 K& L0 T3 G8 G& H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ _* Y3 f8 G; B; \/ e  f" E; M& X' S! w& ~& C
        while(1)# h) M$ l5 x! ?$ e, g0 H
        {
. a3 q8 B7 }5 {4 T5 J! b3 q                read_MSG_buffer(pshreRAM);* [9 u) u+ h8 f- b0 [
        }               
/ X0 j9 }5 T$ I# S# |  a1 ]' w5 e$ g' I}* K/ [4 M% _8 A, d* ^, v

# P0 w3 U; M) z4 B5 b: J8 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  j& e$ \8 Q4 t1 T3 e
{! |4 y! [8 j. T- j
        RX_MSG_PROTOCOL buf;
; M6 \3 _/ J1 ^+ v# b        
6 Q, C. n; o3 J% A        buf.a = pshreRAM->a;) ?5 r8 j) d' S
        buf.b = pshreRAM->b;
: P# s  u/ g1 n1 f# w        buf.packet_cout = pshreRAM->packet_cout;
# j3 `- Z0 e' I0 {        
! H* B. v% ~8 Y3 j. t0 _        if(buf.packet_cout != count_copy)
" m0 k) g5 y5 Z8 f        {! `- h, E0 Z: Y1 i/ \
                printf("a is %d\n", buf.a);
1 t! d: W, \8 e0 h$ k' C6 ^8 E: g                printf("b is %d\n", buf.b);0 i3 z3 O' E5 m0 w; s8 `
                printf("count is %d\n", buf.packet_cout);
$ w! E6 t- B7 n, K) @$ i. C                count_copy = buf.packet_cout;
- A4 Z8 K9 K" G# G: ], w. _" Z        }( [1 e2 a6 r9 h
        else4 w9 N8 [: q6 w3 D) @
        {
. @! K2 R/ V- M4 Y* B! m# l                printf("No effective message!");) |+ m# U# r+ ]% w8 t5 ?
        }
0 O% {; D" ]% N* y}, V! E0 b( E7 o2 x

/ u- b; X' S7 E7 Y! j; g0 X0 B  G- K% u3 m$ Q2 R# y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- z  h% e6 ^% r3 o& _. @# g: m6 _
使用下面代码,对内存使用了mmap函数后:' ^+ J, d4 ?& M* Y( u
#include <stdio.h>
! W5 v5 w: A2 L  ~#include <unistd.h>
# A% j" v/ Y, G+ q4 ^- ~#include <sys/mman.h>/ P0 N& [9 y3 K0 J& y  E
#include <sys/types.h>! d& h7 X) e1 G% U% R
#include <fcntl.h>. Z! Z$ E) R# a# ?
( L- q* i1 l& D4 S  K6 [3 u$ J: U
#define SHAER_RAM_BASE_ADDR    (0x80000000)  O# e1 G/ q! K5 z" H
#define SHAER_RAM_SIZE         (0x20000)   
. E: T7 F1 H6 ~, J1 w$ T
: q5 u5 r8 h& W* }7 j: M4 {4 ktypedef struct8 l: b7 K) l2 }% p: w% U
{
+ y" {( @0 E  _6 s( v, q+ G        unsigned int a;# W" X9 [  e( I% p0 K" W
        unsigned int b;
; Z5 d% x1 m6 g5 Q$ U# `        unsigned int packet_cout;
+ _9 L! ]1 N& X4 G" ?2 R. \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% K2 u( r, J6 M" z3 u

6 @8 U) P( X& \2 ~  v) a4 l0 tvoid read_MSG_buffer(int *baseaddr);
: u$ M3 `7 N! ^8 h% Junsigned int count_copy = 0;
- z# a  P" t" a( @- A
+ ]6 m' ^9 [; Uint main()
9 G( H1 n# Q+ Q0 o+ l{
/ B8 [3 K4 ]! B' r7 V        int fd;
6 H) |2 Y' ^/ Q/ W$ \; d" Q        int *mem = NULL;
2 x: q& O5 n+ N! T1 W) ~  ~0 u; z( ~8 z
        if((fd = open("/dev/mem", O_RDWR)) <0)! @. k* q8 X) s# Q, @" s# E
        {
' {* B2 R' W: `# ^/ N, i* f                perror("open error");: o7 J8 K2 {# C5 E0 \4 ~/ }2 j9 l
                return -1;
1 O+ L2 `* [/ W# U; s3 o        }
; ~# @7 |  t. s1 i* z) `        - ~/ L7 [( C* u) V; R6 @# l
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- P+ Z% i+ W9 Z9 ^% S
# s* A, a8 q' z+ p- P
        while(1)
1 C5 `! G5 R! @5 x; h$ D  O        {
- J" u+ e& r" M9 `. t! G                read_MSG_buffer(mem);/ @/ `4 _" O( U( A- C4 A$ q
        }                6 w/ y, A; ~8 X/ B3 ]6 x
}
0 ^5 `2 P+ x. i5 m8 l9 @) _6 [
  x% W) Z3 Y" f" w: Uvoid read_MSG_buffer(int *baseaddr)
* M0 W% i, z) R' P* D1 T& C: Q' @{
; e! d' o' D7 z# h  K+ L# \7 t        pRX_MSG_PROTOCOL pshreRAM = NULL;
- F& Z; s. Q, _2 ~$ I1 j! ]' P$ T; @; H% m1 o% X
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# z) m7 ^4 i8 D7 S
1 e- ~& W1 x8 B# c        if(pshreRAM->packet_cout != count_copy)% V! V5 G; O' k2 m
        {
, Y0 K8 K- @$ X# t                printf("a is %d\n", pshreRAM->a);
+ {  o! N! X  k& n. M( f9 W$ V9 j0 I                printf("b is %d\n", pshreRAM->b);
6 r# u. K6 s9 b* E$ Z5 I2 h- ?                printf("count is %d\n", pshreRAM->packet_cout);
! F5 I4 E# Q* ~                count_copy = pshreRAM->packet_cout;7 t  R2 g0 c: ?: {/ M  J- \
        }
# A/ z5 M3 t5 D1 Q8 z6 m        else
8 I; K, W; A( Y& d+ E        {
) @! J4 a$ ^6 y( g+ W- e. ^; s                printf("No effective message!\n");- O: l* j% U4 u
        }* B" I) l5 P3 j# z. S
}  d) m8 N, X+ ^( W

: J+ M6 X; t) f+ D2 ^! V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 G' y) R3 q0 v# J1 n
, G' u0 ~; e  z, R$ S# u7 ^% v2 l9 ]- m8 N) I* E# h
# [# q" s3 I( I' z) T
* S: ?# \0 D! b& d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-11 04:30 , Processed in 0.042436 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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